This workbook includes: 1. Creating a Seurat object from CellRanger output. 2. Preparing and cleaning the data a) Visualize QC b) Filter out unwanted cells c) Identify and remove doublets d) Normalization and scale e) Select Variable features 3. Merging and Harmonizing samples a) Merge samples b) Use Seurat find anchors to integrate c) Compare merged vs integrated 4. Dimensional reduction clustering and visualization a) PCA and component selection b) UMAP c) Clustering and visualization 5. Cluster annotation a) Visualize expression of known cell type markers b) Find cluster markers and look them up in reference cell type library c) Manual cluster annotation d) Decisions on merging clusters 6. Automated cluster annotation a) Seurat label transfer b) scClassify

Example data

We will use data from iPSC derived midbrain organoids There are two samples from dissociated midbrain organoids 1) iPSC line from a patient with Parkinson’s Disease carrying a triplication of the gene SNCA 2) The same iPSC line CRISPR corrected to make an isogenenic control

Analysis workflow

Load your required libraries. You need to have these libraries already installed.

Sys.time()
[1] "2023-05-16 21:40:12 CEST"
library(Seurat)
library(tidyverse)
library(DoubletFinder)
library(enrichR)
library(clustree)
library("scClassify")
library(SingleCellExperiment)
library("Matrix")

Load the data: Starting with the control data.

# load data

# read in the data - CellRanger output - barcodes, features, expression matrix

# you need to enter the file path to the folder with the three files
con_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23isogenic/raw_feature_bc_matrix") 
|--------------------------------------------------|
|==================================================|
#Look at the dimensions of the matrix
dim(con_data)
[1]   33538 6794880
#Look at a small part of the data
con_data[1:5, 1:5]
5 x 5 sparse Matrix of class "dgCMatrix"
            AAACCCAAGAAACACT-1 AAACCCAAGAAACCAT-1 AAACCCAAGAAACCCA-1
MIR1302-2HG                  .                  .                  .
FAM138A                      .                  .                  .
OR4F5                        .                  .                  .
AL627309.1                   .                  .                  .
AL627309.3                   .                  .                  .
            AAACCCAAGAAACCCG-1 AAACCCAAGAAACCTG-1
MIR1302-2HG                  .                  .
FAM138A                      .                  .
OR4F5                        .                  .
AL627309.1                   .                  .
AL627309.3                   .                  .
#Look at the distribution of the number of UMIs per cell
colSums(con_data) %>% summary
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
    0.00     0.00     0.00     4.48     0.00 58329.00 
#Look at the distribution of the number of genes per cell  
colSums(con_data > 0) %>% summary
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
   0.000    0.000    0.000    1.695    0.000 7999.000 

Remove barcodes with too few genes that could be empty droplets

#Remove barcodes with less than 100 genes detected (you can select a different value here)
# without 
con_data <- con_data[, colSums(con_data > 0)> 100]
dim(con_data)
[1] 33538  3739
colSums(con_data) %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    106    2125    6243    7442   10872   58329 

Filter genes and create a Seurat object

#We might not want to include genes that occur in few cells are no cells.  Here we will filter out genes/transcripts that are in less than 3 cells. 
# you don't have to filter any genes you can also change to any filter threshold you want

#Make a Seurat object
#Removing any genes detected in less than 3 cells

# we can also filter cells at this stage too. 
con_seu <- CreateSeuratObject(con_data, project = "Control", min.cells = 3)
# look at the object dimensions
con_seu
An object of class Seurat 
18557 features across 3739 samples within 1 assay 
Active assay: RNA (18557 features, 0 variable features)

Data distribution

# look at the distribution of total counts of RNA across cells
con_seu$nCount_RNA %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    106    2125    6240    7441   10870   58316 
# look at the distribution of unique RNA transcripts across cells

con_seu$nFeature_RNA %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  101.0   997.5  2556.0  2433.6  3608.5  7981.0 

Visualize the distributions


VlnPlot(con_seu, features = c("nCount_RNA","nFeature_RNA"), pt.size = 0)

Filter out unwanted cells

# Example cell filtering based on mitochondrial count percentage and number of UMIs ----------

#Calculate the percentage of RNA encoded mitochondrial genes from the mitochondrial DNA
con_seu <- PercentageFeatureSet(con_seu, pattern = "^MT-", col.name = "percent.MT")
con_seu$percent.MT %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   2.257   4.783   8.075   8.524  94.762 
VlnPlot(con_seu, features = "percent.MT", pt.size = 0.001)

Now we will filter some cells with too high mitochondrial RNA Filter out cells with too many RNA reads - these are likely doublets



#Remove any cells with more than 20% mitochondrial counts
con_seu.ft <- subset(con_seu, percent.MT < 20)

#Remove cells with very high UMI counts, which may be possible multiplets
con_seu.ft <- subset(con_seu.ft, nCount_RNA < 20000)

# see the results
VlnPlot(con_seu.ft, features = c("percent.MT", "nCount_RNA", "nFeature_RNA"), pt.size = 0.001)


# check how many cells we have
con_seu.ft
An object of class Seurat 
18557 features across 3219 samples within 1 assay 
Active assay: RNA (18557 features, 0 variable features)
VlnPlot(con_seu.ft, features = "nFeature_RNA", pt.size = 0.001, y.max = 1000)
Warning: Removed 2593 rows containing non-finite values (`stat_ydensity()`).
Warning: Removed 2593 rows containing missing values (`geom_point()`).

We might want to filter more cells with low total and/or unique RNA


# try some different filtering options
con_seu.ft <- subset(con_seu, percent.MT < 20)
dim(con_seu)
[1] 18557  3739
dim(con_seu.ft)
[1] 18557  3392

Apply final filtering conditions


con_seu_ft <- subset(con_seu, nCount_RNA < 60000 & nFeature_RNA > 500 & 
                     percent.MT < 20)

dim(con_seu_ft)
[1] 18557  2938

Clear extra data object we don’t need anymore


rm(con_data,con_seu.ft)

Normalizing

# Normalize data (log normalization) and select genes with variable expression across cells --------------------------------------

con_seu_ft <- NormalizeData(con_seu_ft, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
#Check out the effect of normalization
GetAssayData(con_seu_ft, assay = "RNA", slot = "data") %>% expm1 %>% colSums %>% head
AAACCCAAGAGCTTTC-1 AAACCCACATTGACTG-1 AAACCCAGTTTGGAAA-1 AAACCCATCATCGACA-1 
             10000              10000              10000              10000 
AAACGAAAGCCTGAAG-1 AAACGAAAGGAGAATG-1 
             10000              10000 
GetAssayData(con_seu_ft, assay = "RNA", slot = "counts") %>% colSums %>% head
AAACCCAAGAGCTTTC-1 AAACCCACATTGACTG-1 AAACCCAGTTTGGAAA-1 AAACCCATCATCGACA-1 
              8344              11697               8077               2877 
AAACGAAAGCCTGAAG-1 AAACGAAAGGAGAATG-1 
              6219               6191 

Finding Variable features

# three methods are available to choose variable features in this function
# our selection method is vst
con_seu_ft <- FindVariableFeatures(con_seu_ft, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
var  <- VariableFeatures(con_seu_ft)
VariableFeaturePlot(con_seu_ft)

var[1:10]
 [1] "DLK1"  "TTR"   "CRYAB" "TAC1"  "TPH1"  "CENPF" "ANXA1" "LDHA"  "GDF15" "TFPI2"

Dimensionality reduction PCA and UMAP

#Scaling is recommended before PCA, as otherwise highly expressed genes will have a disproportionate effect on the PC composition

# we are also regressing MT genes to remove them from the PCA
con_seu_ft <- ScaleData(con_seu_ft, vars.to.regress = "percent.MT")
Regressing out percent.MT

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |                                                                          |   1%
  |                                                                                
  |=                                                                         |   1%
  |                                                                                
  |=                                                                         |   2%
  |                                                                                
  |==                                                                        |   2%
  |                                                                                
  |==                                                                        |   3%
  |                                                                                
  |===                                                                       |   3%
  |                                                                                
  |===                                                                       |   4%
  |                                                                                
  |===                                                                       |   5%
  |                                                                                
  |====                                                                      |   5%
  |                                                                                
  |====                                                                      |   6%
  |                                                                                
  |=====                                                                     |   6%
  |                                                                                
  |=====                                                                     |   7%
  |                                                                                
  |======                                                                    |   7%
  |                                                                                
  |======                                                                    |   8%
  |                                                                                
  |======                                                                    |   9%
  |                                                                                
  |=======                                                                   |   9%
  |                                                                                
  |=======                                                                   |  10%
  |                                                                                
  |========                                                                  |  10%
  |                                                                                
  |========                                                                  |  11%
  |                                                                                
  |=========                                                                 |  12%
  |                                                                                
  |=========                                                                 |  13%
  |                                                                                
  |==========                                                                |  13%
  |                                                                                
  |==========                                                                |  14%
  |                                                                                
  |===========                                                               |  14%
  |                                                                                
  |===========                                                               |  15%
  |                                                                                
  |===========                                                               |  16%
  |                                                                                
  |============                                                              |  16%
  |                                                                                
  |============                                                              |  17%
  |                                                                                
  |=============                                                             |  17%
  |                                                                                
  |=============                                                             |  18%
  |                                                                                
  |==============                                                            |  18%
  |                                                                                
  |==============                                                            |  19%
  |                                                                                
  |==============                                                            |  20%
  |                                                                                
  |===============                                                           |  20%
  |                                                                                
  |===============                                                           |  21%
  |                                                                                
  |================                                                          |  21%
  |                                                                                
  |================                                                          |  22%
  |                                                                                
  |=================                                                         |  22%
  |                                                                                
  |=================                                                         |  23%
  |                                                                                
  |=================                                                         |  24%
  |                                                                                
  |==================                                                        |  24%
  |                                                                                
  |==================                                                        |  25%
  |                                                                                
  |===================                                                       |  25%
  |                                                                                
  |===================                                                       |  26%
  |                                                                                
  |====================                                                      |  26%
  |                                                                                
  |====================                                                      |  27%
  |                                                                                
  |====================                                                      |  28%
  |                                                                                
  |=====================                                                     |  28%
  |                                                                                
  |=====================                                                     |  29%
  |                                                                                
  |======================                                                    |  29%
  |                                                                                
  |======================                                                    |  30%
  |                                                                                
  |=======================                                                   |  30%
  |                                                                                
  |=======================                                                   |  31%
  |                                                                                
  |=======================                                                   |  32%
  |                                                                                
  |========================                                                  |  32%
  |                                                                                
  |========================                                                  |  33%
  |                                                                                
  |=========================                                                 |  33%
  |                                                                                
  |=========================                                                 |  34%
  |                                                                                
  |==========================                                                |  34%
  |                                                                                
  |==========================                                                |  35%
  |                                                                                
  |==========================                                                |  36%
  |                                                                                
  |===========================                                               |  36%
  |                                                                                
  |===========================                                               |  37%
  |                                                                                
  |============================                                              |  37%
  |                                                                                
  |============================                                              |  38%
  |                                                                                
  |=============================                                             |  39%
  |                                                                                
  |=============================                                             |  40%
  |                                                                                
  |==============================                                            |  40%
  |                                                                                
  |==============================                                            |  41%
  |                                                                                
  |===============================                                           |  41%
  |                                                                                
  |===============================                                           |  42%
  |                                                                                
  |===============================                                           |  43%
  |                                                                                
  |================================                                          |  43%
  |                                                                                
  |================================                                          |  44%
  |                                                                                
  |=================================                                         |  44%
  |                                                                                
  |=================================                                         |  45%
  |                                                                                
  |==================================                                        |  45%
  |                                                                                
  |==================================                                        |  46%
  |                                                                                
  |==================================                                        |  47%
  |                                                                                
  |===================================                                       |  47%
  |                                                                                
  |===================================                                       |  48%
  |                                                                                
  |====================================                                      |  48%
  |                                                                                
  |====================================                                      |  49%
  |                                                                                
  |=====================================                                     |  49%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |=====================================                                     |  51%
  |                                                                                
  |======================================                                    |  51%
  |                                                                                
  |======================================                                    |  52%
  |                                                                                
  |=======================================                                   |  52%
  |                                                                                
  |=======================================                                   |  53%
  |                                                                                
  |========================================                                  |  53%
  |                                                                                
  |========================================                                  |  54%
  |                                                                                
  |========================================                                  |  55%
  |                                                                                
  |=========================================                                 |  55%
  |                                                                                
  |=========================================                                 |  56%
  |                                                                                
  |==========================================                                |  56%
  |                                                                                
  |==========================================                                |  57%
  |                                                                                
  |===========================================                               |  57%
  |                                                                                
  |===========================================                               |  58%
  |                                                                                
  |===========================================                               |  59%
  |                                                                                
  |============================================                              |  59%
  |                                                                                
  |============================================                              |  60%
  |                                                                                
  |=============================================                             |  60%
  |                                                                                
  |=============================================                             |  61%
  |                                                                                
  |==============================================                            |  62%
  |                                                                                
  |==============================================                            |  63%
  |                                                                                
  |===============================================                           |  63%
  |                                                                                
  |===============================================                           |  64%
  |                                                                                
  |================================================                          |  64%
  |                                                                                
  |================================================                          |  65%
  |                                                                                
  |================================================                          |  66%
  |                                                                                
  |=================================================                         |  66%
  |                                                                                
  |=================================================                         |  67%
  |                                                                                
  |==================================================                        |  67%
  |                                                                                
  |==================================================                        |  68%
  |                                                                                
  |===================================================                       |  68%
  |                                                                                
  |===================================================                       |  69%
  |                                                                                
  |===================================================                       |  70%
  |                                                                                
  |====================================================                      |  70%
  |                                                                                
  |====================================================                      |  71%
  |                                                                                
  |=====================================================                     |  71%
  |                                                                                
  |=====================================================                     |  72%
  |                                                                                
  |======================================================                    |  72%
  |                                                                                
  |======================================================                    |  73%
  |                                                                                
  |======================================================                    |  74%
  |                                                                                
  |=======================================================                   |  74%
  |                                                                                
  |=======================================================                   |  75%
  |                                                                                
  |========================================================                  |  75%
  |                                                                                
  |========================================================                  |  76%
  |                                                                                
  |=========================================================                 |  76%
  |                                                                                
  |=========================================================                 |  77%
  |                                                                                
  |=========================================================                 |  78%
  |                                                                                
  |==========================================================                |  78%
  |                                                                                
  |==========================================================                |  79%
  |                                                                                
  |===========================================================               |  79%
  |                                                                                
  |===========================================================               |  80%
  |                                                                                
  |============================================================              |  80%
  |                                                                                
  |============================================================              |  81%
  |                                                                                
  |============================================================              |  82%
  |                                                                                
  |=============================================================             |  82%
  |                                                                                
  |=============================================================             |  83%
  |                                                                                
  |==============================================================            |  83%
  |                                                                                
  |==============================================================            |  84%
  |                                                                                
  |===============================================================           |  84%
  |                                                                                
  |===============================================================           |  85%
  |                                                                                
  |===============================================================           |  86%
  |                                                                                
  |================================================================          |  86%
  |                                                                                
  |================================================================          |  87%
  |                                                                                
  |=================================================================         |  87%
  |                                                                                
  |=================================================================         |  88%
  |                                                                                
  |==================================================================        |  89%
  |                                                                                
  |==================================================================        |  90%
  |                                                                                
  |===================================================================       |  90%
  |                                                                                
  |===================================================================       |  91%
  |                                                                                
  |====================================================================      |  91%
  |                                                                                
  |====================================================================      |  92%
  |                                                                                
  |====================================================================      |  93%
  |                                                                                
  |=====================================================================     |  93%
  |                                                                                
  |=====================================================================     |  94%
  |                                                                                
  |======================================================================    |  94%
  |                                                                                
  |======================================================================    |  95%
  |                                                                                
  |=======================================================================   |  95%
  |                                                                                
  |=======================================================================   |  96%
  |                                                                                
  |=======================================================================   |  97%
  |                                                                                
  |========================================================================  |  97%
  |                                                                                
  |========================================================================  |  98%
  |                                                                                
  |========================================================================= |  98%
  |                                                                                
  |========================================================================= |  99%
  |                                                                                
  |==========================================================================|  99%
  |                                                                                
  |==========================================================================| 100%
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
con_seu_ft@assays$RNA@scale.data %>% dim
[1] 2000 2938
#Linear dimensionality reduction
#Choosing the number of PCs can depend on how many cells you have
con_seu_ft <- RunPCA(con_seu_ft, assay = "RNA", npcs = 30)
PC_ 1 
Positive:  INA, DCX, NSG2, SYT1, BASP1, STMN1, NSG1, NREP, STMN2, IGF1 
       SOX4, PPFIA2, ANK3, MIR124-2HG, SLC8A1, CDH8, PKIA, GAD1, OLFM1, PRKAR2B 
       NNAT, CELF4, SNAP25, ATP1B1, CNTNAP2, SCN2A, SYNPR, CXADR, CSRNP3, ACSL4 
Negative:  PON2, GNG5, B2M, NTRK2, CD99, ZFP36L1, SPARC, SOX2, CLU, DBI 
       PMP2, ANXA5, CST3, CNN3, HLA-A, BCAN, PTN, NFIA, TTYH1, MPC1 
       GPM6B, TMEM123, PSAT1, CD9, CDK2AP1, PTPRZ1, CALU, MGST1, SOX9, SAT1 
PC_ 2 
Positive:  EGLN3, CYSTM1, S100A6, FTL, EIF1, SELENOM, S100A10, PLOD2, SLIT2, PLA2G16 
       SQSTM1, FTH1, CD44, CRYAB, BNIP3, PTGDS, DDIT3, ANXA2, SAT1, GDF15 
       P4HA1, CLU, NPC2, NUPR1, MAP1LC3B, MGST1, TFF3, FOXA1, ATF5, ADGRV1 
Negative:  CDK1, MKI67, TOP2A, PBK, NUSAP1, CENPF, PCLAF, NUF2, UBE2C, RRM2 
       CCNA2, NDC80, SPC25, SGO1, ESCO2, TPX2, ZWINT, CENPU, NCAPG, KIF15 
       CKAP2L, ASPM, KIF11, PIMREG, KNL1, MELK, KIFC1, CENPK, DLGAP5, MIS18BP1 
PC_ 3 
Positive:  NRXN1, MT-CO3, CSPG5, LINC00461, BCAN, OMG, VCAM1, PMP2, ST6GAL2, C1orf61 
       PTPRZ1, COLGALT2, LSAMP, LRRN3, SESN3, GABBR2, MSTN, MT-ND3, PTN, TFPI 
       MEIS2, LIX1, TTYH1, KCNQ3, SLC1A2, AQP4, CST3, LINC01896, NTRK2, ATP1B2 
Negative:  GDF15, ATF3, ATF5, S100A11, GADD45A, CDKN1A, ANXA2, EIF1, PPP1R15A, FTL 
       DDIT3, YBX3, SEC61G, TYMS, BTG3, ANXA1, CRABP2, GPNMB, S100A6, PLOD2 
       CLGN, LINC02154, TRMT112, TUBB6, CRYAB, KDELR2, TPT1, STC2, FTH1, ATF4 
PC_ 4 
Positive:  ATF3, PPP1R15A, C1orf61, ATF5, CDKN1A, GADD45G, DLL1, GDF15, DDIT3, GADD45A 
       EGFR, LINC02154, AEN, ODC1, HIST1H2AC, GPNMB, PURPL, PMP2, SGCG, EIF1 
       TRBC2, GBE1, SESN2, PMAIP1, EDA2R, SERPINB8, HRK, HIST1H4H, IFRD1, SDCBP 
Negative:  KCNJ16, SLIT2, RSPO2, PEG10, ABCA8, NRN1, FOXA1, LGI1, CFC1, DCN 
       MSX1, SERTM1, PMP22, PLXDC2, C3orf58, COL21A1, KCNMB1, PDLIM5, SULF2, ASB4 
       EFNB3, TRABD2A, PTPRG, TFF3, PAMR1, CDO1, TMEM163, VAT1L, CPE, IGFBP5 
PC_ 5 
Positive:  SOX14, SYNPR, IGF1, PRSS12, KIZ, SEMA3C, UNC13C, GAD1, GAD2, MEIS2 
       IGFBP5, CHRM2, OTX2, DMBX1, SV2C, NYAP2, DSEL, AC007159.1, NR2F2, DIRC3 
       AC110597.1, SLC32A1, GATA3, GREM2, PLCB1, ZFPM2, TSPAN18, CCSER1, IGSF21, CNTNAP2 
Negative:  GAP43, ELAVL4, NEFL, MAP1B, GLRA2, RND3, NEFM, GPRIN3, GABRG2, ELAVL2 
       TCF4, POU3F2, RAB3B, SCG2, TENM2, ARHGAP21, TMSB4X, PLPPR1, NOVA1, CRABP1 
       NTRK3, PIK3R1, DNAJC6, SLC17A6, ANKS1B, TENM1, DACH1, SYT4, FGF12, PCDH17 
PCAPlot(con_seu_ft)


#Assess how many PCs capture most of the information in the data 
ElbowPlot(con_seu_ft, ndims = 30)

We won’t run this code I’ve included this analysis that calculates the cut-off for signicance of component numbers. However the function runs multiple iterations of the PCA and will take a long time to run.

# Jackstraw

#Assess how many PCs capture most of the information in the data 
seu <-JackStraw(seu, reduction = "pca",
  dims = 30)
seu <- ScoreJackStraw(seu, reduction = "pca", dims = 1:30)
JackStrawPlot(seu, dims = 1:30)

Non-linear dimensional reduction using UMAP


#Non-linear dimensionality reduction
#Choosing how many PCs to input can depend on the elbow plot and on the number of cells
#There are many parameters that can e tweaked and optimized in a UMAP plot
#You can see some demos here: https://pair-code.github.io/understanding-umap/
con_seu_ft <- RunUMAP(con_seu_ft, dims = 1:18)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
14:31:52 UMAP embedding parameters a = 0.9922 b = 1.112
14:31:52 Read 2938 rows and found 18 numeric columns
14:31:52 Using Annoy for neighbor search, n_neighbors = 30
14:31:52 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:31:53 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpgyVOQf/fileaa4e718c5243
14:31:53 Searching Annoy index using 1 thread, search_k = 3000
14:31:53 Annoy recall = 100%
14:31:54 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
14:31:55 Initializing from normalized Laplacian + noise (using irlba)
14:31:55 Commencing optimization for 500 epochs, with 116704 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:32:00 Optimization finished
UMAPPlot(con_seu_ft)

NA
NA

Doublet identification


# Assess possible doublets  -----------------------------------------------
#Using instructions here: https://github.com/chris-mcginnis-ucsf/

#First we have to find a pK which determines how big of a neighborhood will be examined for doublets
#This should be chosen for each library separately
#First we test a number of pN (proportion of generated artificial doublets) and pK
#We get different lists of probabilities of artifical nearest neighbors with these tested parameters
#Also keep in mind the results are not deterministic (every run will give slightly different results)
sweep.res.con <- paramSweep_v3(con_seu_ft, PCs = 1:18, sct = FALSE)
Loading required package: fields
Loading required package: spam
Spam version 2.9-1 (2022-08-07) is loaded.
Type 'help( Spam)' or 'demo( spam)' for a short introduction 
and overview of this package.
Help for individual functions is also obtained by adding the
suffix '.spam' to the function name, e.g. 'help( chol.spam)'.

Attaching package: ‘spam’

The following object is masked from ‘package:Matrix’:

    det

The following object is masked from ‘package:stats4’:

    mle

The following objects are masked from ‘package:base’:

    backsolve, forwardsolve

Loading required package: viridis
Loading required package: viridisLite

Try help(fields) to get started.
[1] "Creating artificial doublets for pN = 5%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 10%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 15%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 20%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 25%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
[1] "Creating artificial doublets for pN = 30%"
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Defining neighborhoods..."
[1] "Computing pANN across all pK..."
[1] "pK = 0.005..."
[1] "pK = 0.01..."
[1] "pK = 0.02..."
[1] "pK = 0.03..."
[1] "pK = 0.04..."
[1] "pK = 0.05..."
[1] "pK = 0.06..."
[1] "pK = 0.07..."
[1] "pK = 0.08..."
[1] "pK = 0.09..."
[1] "pK = 0.1..."
[1] "pK = 0.11..."
[1] "pK = 0.12..."
[1] "pK = 0.13..."
[1] "pK = 0.14..."
[1] "pK = 0.15..."
[1] "pK = 0.16..."
[1] "pK = 0.17..."
[1] "pK = 0.18..."
[1] "pK = 0.19..."
[1] "pK = 0.2..."
[1] "pK = 0.21..."
[1] "pK = 0.22..."
[1] "pK = 0.23..."
[1] "pK = 0.24..."
[1] "pK = 0.25..."
[1] "pK = 0.26..."
[1] "pK = 0.27..."
[1] "pK = 0.28..."
[1] "pK = 0.29..."
[1] "pK = 0.3..."
#We do not have the "ground truth" regarding doublets, such from from genotype data for pooled samples 
#We sumamrize the performance of the range of pN=pK parameters we tested
sweep.stats_con <- summarizeSweep(sweep.res.con, GT = FALSE)
Loading required package: KernSmooth
KernSmooth 2.23 loaded
Copyright M. P. Wand 1997-2009
Loading required package: ROCR
#Here the "best" pK for the data is chosen based on a metric determined by the DoubletFinder developers
#Which performs best in datasets where the ground truth is known
bcmvn_con <- find.pK(sweep.stats_con)
NULL

ggplot(bcmvn_con, aes(x = pK, y = BCmetric, group = "Sweep")) + geom_point() + geom_line() + 
  theme(axis.text.x = element_text(angle = 90))


#We will pick pK = 0.08
#We are not going to use our clustering information to estimate "homotypic" doublets
#We are simply going to use an expected doublet formation rate of 2.5% based on the number of starting cells loaded

nExp_poi <- round(0.025*nrow(con_seu_ft@meta.data))
con_seu_ft <- doubletFinder_v3(con_seu_ft, PCs = 1:18, pN = 0.25, pK = 0.08, nExp = nExp_poi, reuse.pANN = FALSE, sct = FALSE)
[1] "Creating 979 artificial doublets..."
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                                                
  |                                                                          |   0%
  |                                                                                
  |=====================================                                     |  50%
  |                                                                                
  |==========================================================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Computing pANN..."
[1] "Classifying doublets.."
#Here we update the Seurat object version just in case the one returned by DoubletFinder is an older version
con_seu_ft <- UpdateSeuratObject(con_seu_ft)
Validating object structure
Updating object slots
Ensuring keys are in the proper structure
Ensuring feature names don't have underscores or pipes
Object representation is consistent with the most current Seurat version
# we have now identified doublets but we have not removed them

Visualize the doublet removal results


# we need to look in the data object

#Visualize and assess the cells called as probable doublets
UMAPPlot(con_seu_ft, group.by = "DF.classifications_0.25_0.08_73")


# table of doublets and signlets
con_seu_ft$DF.classifications_0.25_0.08_73 %>% table
.
Doublet Singlet 
     73    2865 
# visualize the features in doublets and singlets
VlnPlot(con_seu_ft, features = c("nCount_RNA", "nFeature_RNA", "percent.MT", "pANN_0.25_0.08_73"), 
        group.by = "DF.classifications_0.25_0.08_73", pt.size = 0.001, ncol = 2, log = TRUE)

# remove the doublets
# we can do this by subset
# first we need to set the active meta data slot to the doublet identification
Idents(con_seu_ft) <- "DF.classifications_0.25_0.08_73"
# we select only the singlet cells
con_seu_ft2 <- subset(con_seu_ft, idents = "Singlet")
dim(con_seu_ft)
[1] 18557  2938
dim(con_seu_ft2)
[1] 18557  2865

Repeat the above steps for the SNCA triplication patient line

# read in data

ast_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23/raw_feature_bc_matrix")


# create seurat object


# filter object with the same settings as with the control


# PCA analysis

# Remove doublets
# clean up 
rm(ast_data,ast_seu_ft,bcmvn_ast,bcmvn_con,con_seu_ft, sweep.res.ast, sweep.res.con, sweep.stats_ast, sweep.stats_con)

BREAK

Merge data objects


merge_seurat <- merge(con_seu_ft2,ast_seu_ft2)
Warning in CheckDuplicateCellNames(object.list = objects) :
  Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.
merge_seurat
An object of class Seurat 
19204 features across 4028 samples within 1 assay 
Active assay: RNA (19204 features, 0 variable features)
unique(merge_seurat$orig.ident)
[1] "Control" "SNCA"   

Find anchors between the two data objects

sample.list <- SplitObject(merge_seurat, split.by = "orig.ident")

# We have already normalized and identified variable features in each sample
# If we had not done so we can normalize here
#for (i in 1:length(sample.list)){
 # org.list[[i]] <- NormalizeData(org.list[[i]], verbose = FALSE)
  #org.list[[i]] <- FindVariableFeatures(org.list[[i]], selection.method = "vst")
#}

# Now we find features that can act as anchors between the two samples
int.anchors <- FindIntegrationAnchors(object.list = sample.list, dims = 1:50)
Computing 2000 integration features
No variable features found for object1 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
No variable features found for object2 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling features for provided objects

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Finding all pairwise anchors

  |                                                  | 0 % ~calculating  
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 4320 anchors
Filtering anchors
    Retained 3529 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=16s  
integrated_seurat <- IntegrateData(anchorset = int.anchors, dims = 1:50)
Merging dataset 2 into 1
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data

Optional: save the integrated object or read in the Integrated object for the next step.

# remove # comment from the code you want to run

saveRDS(integrated_seurat,"IntegratedSeurat.RDS")
#integrated_seurate <- readRDS("IntegratedSeurat.RDS")

PCA and UMAP on the merged object

# merged object

DefaultAssay(merge_seurat) <- "RNA"

merge_seurat <- ScaleData(merge_seurat, verbose = FALSE)
# in the merge data set we sill need features for the PCA input
merge_seurat <- FindVariableFeatures(merge_seurat, selection.method = "vst")
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
merge_seurat <- RunPCA(merge_seurat, npcs = 30, verbose = FALSE)
merge_seurat <- RunUMAP(merge_seurat, reduction = "pca", dims = 1:30)
15:10:21 UMAP embedding parameters a = 0.9922 b = 1.112
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:21 Read 4028 rows and found 30 numeric columns
15:10:21 Using Annoy for neighbor search, n_neighbors = 30
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:21 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:22 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpgyVOQf/fileaa4ec70e42c
15:10:22 Searching Annoy index using 1 thread, search_k = 3000
15:10:22 Annoy recall = 100%
15:10:23 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
15:10:24 Initializing from normalized Laplacian + noise (using irlba)
15:10:24 Commencing optimization for 500 epochs, with 163142 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:31 Optimization finished

Repeat PCA and UMAP for the integrated object

Idents(integrated_seurat) <- "integrated"
integrated_seurat <- ScaleData(integrated_seurat, verbose = FALSE)
# only the integrated features will be the pca input

integrated_seurat <- RunPCA(integrated_seurat, npcs = 30, verbose = FALSE)
integrated_seurat <- RunUMAP(integrated_seurat, reduction = "pca", dims = 1:30)
15:10:48 UMAP embedding parameters a = 0.9922 b = 1.112
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:48 Read 4028 rows and found 30 numeric columns
15:10:48 Using Annoy for neighbor search, n_neighbors = 30
Found more than one class "dist" in cache; using the first, from namespace 'BiocGenerics'
Also defined by ‘spam’
15:10:48 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:48 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpgyVOQf/fileaa4e47940b15
15:10:48 Searching Annoy index using 1 thread, search_k = 3000
15:10:49 Annoy recall = 100%
15:10:49 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
15:10:50 Initializing from normalized Laplacian + noise (using irlba)
15:10:50 Commencing optimization for 500 epochs, with 165954 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:10:57 Optimization finished

Optional: save the PCA and UMAP integrated object or read in the saved object

# remove # comment from the code you want to run
saveRDS(integrated_seurat,"IntegratedSeuratGraphs.RDS")
#integrated_seurat <- readRDS("IntegratedSeuratGraphs.RDS")

Let’s look at the UMAPs from the merged vs the integrated data


p1 <- DimPlot(merge_seurat, group.by = "orig.ident") + ggtitle("Merge")
p2 <- DimPlot(integrated_seurat, group.by = "orig.ident") + ggtitle("Integrated")

p1

p2

We see almost no difference in this data. This is not the case in all data sets

Cluster the integrated data

# see the importance of the pca components
ElbowPlot(integrated_seurat, ndims=30)

integrated_seurat
An object of class Seurat 
21204 features across 4028 samples within 2 assays 
Active assay: integrated (2000 features, 2000 variable features)
 1 other assay present: RNA
 2 dimensional reductions calculated: pca, umap
dim(integrated_seurat)
[1] 2000 4028

We will choose 20 PCs There are 4028 cells. A common rule of thumb for choosing k for nearest neighbours is using the square root of the number of cells = 63

Visualize the UMAP of the different cluster resolutions

res <- c(0.05,0.25,0.4,0.5,0.6,1,1.5)
resolutions <- paste("integrated_snn_res.", res, sep="")
resolutions
[1] "integrated_snn_res.0.05" "integrated_snn_res.0.25" "integrated_snn_res.0.4" 
[4] "integrated_snn_res.0.5"  "integrated_snn_res.0.6"  "integrated_snn_res.1"   
[7] "integrated_snn_res.1.5" 
for(r in resolutions){
  print(DimPlot(integrated_seurat, group.by = r))
}

NA
NA

BREAK

Now we need to choose a resolution to annotate. I will select resolution of 0.6.

# Scale the total RNA
# before we only scaled the integrated expression for the genes used for integration
# now we want to scale all genes

DefaultAssay(integrated_seurat) <- "RNA"
integrated_seurat <- ScaleData(integrated_seurat)
Centering and scaling data matrix

  |                                                                                          
  |                                                                                    |   0%
  |                                                                                          
  |====                                                                                |   5%
  |                                                                                          
  |========                                                                            |  10%
  |                                                                                          
  |=============                                                                       |  15%
  |                                                                                          
  |=================                                                                   |  20%
  |                                                                                          
  |=====================                                                               |  25%
  |                                                                                          
  |=========================                                                           |  30%
  |                                                                                          
  |=============================                                                       |  35%
  |                                                                                          
  |==================================                                                  |  40%
  |                                                                                          
  |======================================                                              |  45%
  |                                                                                          
  |==========================================                                          |  50%
  |                                                                                          
  |==============================================                                      |  55%
  |                                                                                          
  |==================================================                                  |  60%
  |                                                                                          
  |=======================================================                             |  65%
  |                                                                                          
  |===========================================================                         |  70%
  |                                                                                          
  |===============================================================                     |  75%
  |                                                                                          
  |===================================================================                 |  80%
  |                                                                                          
  |=======================================================================             |  85%
  |                                                                                          
  |============================================================================        |  90%
  |                                                                                          
  |================================================================================    |  95%
  |                                                                                          
  |====================================================================================| 100%

Look at known cell type markers

# features list from literature

da_neurons <- c("TH","SLC6A3","SLC18A2","SOX6","NDNF","SNCG","ALDH1A1","CALB1","TACR2","SLC17A6","SLC32A1","OTX2","GRP","LPL","CCK","VIP")
NPC_orStemLike <- c("DCX","NEUROD1","TBR1","PCNA","MKI67","SOX2","NES","PAX6","MASH1")
mature_neurons = c("RBFOX3","SYP","DLG45","VAMP1","VAMP2","TUBB3","SYT1","BSN","HOMER1","SLC17A6")
excitatory_neurons = c("GRIA2","GRIA1","GRIA4","GRIN1","GRIN2B","GRIN2A","GRIN3A","GRIN3","GRIP1","CAMK2A")
inhbitory_neurons = inh = c("GAD1","GAD2", "GAT1","PVALB","GABR2","GABR1","GBRR1","GABRB2","GABRB1","GABRB3","GABRA6","GABRA1","GABRA4","TRAK2")
astrocytes <- c("GFAP","S100B","AQP4","APOE", "SOX9","SLC1A3")
oligodendrocytes <- c("MBP","MOG","OLIG1","OLIG2","SOX10")
opc <- 
radial_glia <- c("PTPRC","AIF1","ADGRE1", "VIM", "TNC","PTPRZ1","FAM107A","HOPX","LIFR",
              "ITGB5","IL6ST","SLC1A3")
epithelial <- c("HES1","HES5","SOX2","SOX10","NES","CDH1","NOTCH1")

microglia <- c("IBA1","P2RY12","P2RY13","TREM119", "GPR34","SIGLECH","TREM2",
               "CX3CR1","FCRLS","OLFML3","HEXB","TGFBR1", "SALL1","MERTK",
               "PROS1")

features_list <- c("MKI67","SOX2","POU5F1","DLX2","PAX6","SOX9","HES1","NES","RBFOX3","MAP2","NCAM1","CD24","GRIA2","GRIN2B","GABBR1","GAD1","GAD2","GABRA1","GABRB2","TH","ALDH1A1","LMX1B","NR4A2","CORIN","CALB1","KCNJ6","CXCR4","ITGA6","SLC1A3","CD44","AQP4","S100B", "PDGFRA","OLIG2","MBP","CLDN11","VIM","VCAM1")

short_list <- c("MKI67","SOX9","HES1","NES","DLX2","RBFOX3","MAP2","TH","CALB1","KCNJ6","SLC1A3","CD44","AQP4","S100B","OLIG2","MBP","VIM")

Seurat has several helpful plotting function that use ggplot

# we set the active identity of the meta data to be the clusters at the resolution we want to label
Idents(integrated_seurat) <- "integrated_snn_res.0.6"

FeaturePlot(integrated_seurat, label = TRUE, features = short_list)

NA
NA
NA
# this will let us see one at at time
for (i in short_list) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}

NA
NA

Now that we see the TH is all in one spot that is part of a large cluster we look back at the different cluster level.

Dot Plots


DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = short_list, assay = "RNA") + RotatedAxis()




DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = da_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
  The following requested variables were not found: SLC6A3, TACR2, VIP

DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = mature_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
  The following requested variables were not found: DLG45

Heatmaps



DoHeatmap(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = short_list, slot = "scale.data")

NA
NA

Look at more expression lists

Find Cluster markers

# cluster markers will be calculated for the active identity

Idents(integrated_seurat) <- "integrated_snn_res.1"
ClusterMarkers <- FindAllMarkers(integrated_seurat, only.pos = TRUE)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~14s          
  |++                                                | 2 % ~14s          
  |++                                                | 3 % ~14s          
  |+++                                               | 4 % ~14s          
  |+++                                               | 5 % ~13s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |+++++                                             | 10% ~13s          
  |++++++                                            | 11% ~12s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |+++++++++                                         | 16% ~11s          
  |+++++++++                                         | 17% ~11s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 22% ~11s          
  |++++++++++++                                      | 23% ~10s          
  |++++++++++++                                      | 24% ~10s          
  |+++++++++++++                                     | 25% ~10s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |++++++++++++++++                                  | 30% ~09s          
  |++++++++++++++++                                  | 31% ~09s          
  |+++++++++++++++++                                 | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |+++++++++++++++++++                               | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |+++++++++++++++++++++                             | 42% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |+++++++++++++++++++++++                           | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |++++++++++++++++++++++++                          | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |+++++++++++++++++++++++++                         | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |++++++++++++++++++++++++++                        | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |+++++++++++++++++++++++++++                       | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |++++++++++++++++++++++++++++                      | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 58% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |+++++++++++++++++++++++++++++++                   | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |++++++++++++++++++++++++++++++++                  | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=13s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~12s          
  |++                                                | 2 % ~11s          
  |++                                                | 3 % ~11s          
  |+++                                               | 4 % ~11s          
  |+++                                               | 5 % ~11s          
  |++++                                              | 7 % ~10s          
  |++++                                              | 8 % ~10s          
  |+++++                                             | 9 % ~10s          
  |+++++                                             | 10% ~10s          
  |++++++                                            | 11% ~10s          
  |+++++++                                           | 12% ~10s          
  |+++++++                                           | 13% ~10s          
  |++++++++                                          | 14% ~09s          
  |++++++++                                          | 15% ~09s          
  |+++++++++                                         | 16% ~09s          
  |+++++++++                                         | 18% ~09s          
  |++++++++++                                        | 19% ~09s          
  |++++++++++                                        | 20% ~09s          
  |+++++++++++                                       | 21% ~09s          
  |+++++++++++                                       | 22% ~09s          
  |++++++++++++                                      | 23% ~08s          
  |+++++++++++++                                     | 24% ~08s          
  |+++++++++++++                                     | 25% ~08s          
  |++++++++++++++                                    | 26% ~08s          
  |++++++++++++++                                    | 27% ~08s          
  |+++++++++++++++                                   | 29% ~08s          
  |+++++++++++++++                                   | 30% ~08s          
  |++++++++++++++++                                  | 31% ~07s          
  |++++++++++++++++                                  | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |++++++++++++++++++                                | 34% ~07s          
  |++++++++++++++++++                                | 35% ~07s          
  |+++++++++++++++++++                               | 36% ~07s          
  |+++++++++++++++++++                               | 37% ~07s          
  |++++++++++++++++++++                              | 38% ~07s          
  |++++++++++++++++++++                              | 40% ~07s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |+++++++++++++++++++++                             | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |++++++++++++++++++++++                            | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~06s          
  |++++++++++++++++++++++++                          | 46% ~06s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |+++++++++++++++++++++++++                         | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |+++++++++++++++++++++++++++++                     | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |++++++++++++++++++++++++++++++                    | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |+++++++++++++++++++++++++++++++                   | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=11s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |+                                                 | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |++                                                | 4 % ~07s          
  |+++                                               | 5 % ~06s          
  |+++                                               | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |++++                                              | 8 % ~06s          
  |+++++                                             | 9 % ~06s          
  |+++++                                             | 10% ~06s          
  |++++++                                            | 11% ~06s          
  |++++++                                            | 12% ~06s          
  |+++++++                                           | 13% ~06s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~05s          
  |++++++++++                                        | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |+++++++++++                                       | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |++++++++++++                                      | 24% ~05s          
  |+++++++++++++                                     | 25% ~05s          
  |+++++++++++++                                     | 26% ~05s          
  |++++++++++++++                                    | 27% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |++++++++++++++++++                                | 36% ~04s          
  |+++++++++++++++++++                               | 37% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |++++++++++++++++++++++++++                        | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~18s          
  |+++                                               | 5 % ~18s          
  |++++                                              | 6 % ~18s          
  |++++                                              | 7 % ~17s          
  |+++++                                             | 8 % ~17s          
  |+++++                                             | 9 % ~17s          
  |++++++                                            | 10% ~17s          
  |++++++                                            | 11% ~17s          
  |+++++++                                           | 12% ~16s          
  |+++++++                                           | 14% ~16s          
  |++++++++                                          | 15% ~16s          
  |++++++++                                          | 16% ~16s          
  |+++++++++                                         | 17% ~16s          
  |+++++++++                                         | 18% ~15s          
  |++++++++++                                        | 19% ~15s          
  |++++++++++                                        | 20% ~15s          
  |+++++++++++                                       | 21% ~15s          
  |+++++++++++                                       | 22% ~15s          
  |++++++++++++                                      | 23% ~14s          
  |++++++++++++                                      | 24% ~14s          
  |+++++++++++++                                     | 25% ~14s          
  |++++++++++++++                                    | 26% ~14s          
  |++++++++++++++                                    | 27% ~14s          
  |+++++++++++++++                                   | 28% ~13s          
  |+++++++++++++++                                   | 29% ~13s          
  |++++++++++++++++                                  | 30% ~13s          
  |++++++++++++++++                                  | 31% ~13s          
  |+++++++++++++++++                                 | 32% ~13s          
  |+++++++++++++++++                                 | 33% ~12s          
  |++++++++++++++++++                                | 34% ~12s          
  |++++++++++++++++++                                | 35% ~12s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~11s          
  |++++++++++++++++++++                              | 40% ~11s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |+++++++++++++++++++++                             | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |++++++++++++++++++++++                            | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~10s          
  |+++++++++++++++++++++++                           | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |++++++++++++++++++++++++                          | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |+++++++++++++++++++++++++                         | 50% ~09s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |+++++++++++++++++++++++++++++                     | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |++++++++++++++++++++++++++++++                    | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |+++++++++++++++++++++++++++++++                   | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~06s          
  |++                                                | 2 % ~06s          
  |++                                                | 3 % ~06s          
  |+++                                               | 4 % ~06s          
  |+++                                               | 5 % ~06s          
  |++++                                              | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 9 % ~06s          
  |++++++                                            | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |++++++++                                          | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |+++++++++                                         | 18% ~05s          
  |++++++++++                                        | 19% ~05s          
  |++++++++++                                        | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |+++++++++++                                       | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |++++++++++++                                      | 24% ~05s          
  |+++++++++++++                                     | 25% ~05s          
  |++++++++++++++                                    | 26% ~05s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |++++++++++++++++                                  | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 36% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~15s          
  |++                                                | 2 % ~14s          
  |++                                                | 3 % ~13s          
  |+++                                               | 4 % ~13s          
  |+++                                               | 5 % ~13s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |++++++                                            | 10% ~12s          
  |++++++                                            | 11% ~12s          
  |+++++++                                           | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |++++++++                                          | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |+++++++++                                         | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~12s          
  |+++++++++++                                       | 20% ~12s          
  |+++++++++++                                       | 21% ~12s          
  |++++++++++++                                      | 22% ~12s          
  |++++++++++++                                      | 23% ~11s          
  |+++++++++++++                                     | 24% ~11s          
  |+++++++++++++                                     | 26% ~11s          
  |++++++++++++++                                    | 27% ~11s          
  |++++++++++++++                                    | 28% ~11s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~10s          
  |+++++++++++++++++                                 | 33% ~10s          
  |+++++++++++++++++                                 | 34% ~10s          
  |++++++++++++++++++                                | 35% ~10s          
  |++++++++++++++++++                                | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |+++++++++++++++++++                               | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~09s          
  |+++++++++++++++++++++                             | 41% ~09s          
  |+++++++++++++++++++++                             | 42% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~08s          
  |++++++++++++++++++++++++                          | 47% ~08s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |++++++++++++++++++++++++++++                      | 54% ~07s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 58% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |+++++++++++++++++++++++++++++++                   | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |++++++++++++++++++++++++++++++++                  | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |++++++++++++++++++++++++++++++++++                | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~20s          
  |++                                                | 3 % ~20s          
  |+++                                               | 4 % ~20s          
  |+++                                               | 5 % ~19s          
  |++++                                              | 6 % ~19s          
  |++++                                              | 7 % ~19s          
  |+++++                                             | 8 % ~19s          
  |+++++                                             | 9 % ~19s          
  |++++++                                            | 10% ~19s          
  |++++++                                            | 11% ~18s          
  |+++++++                                           | 12% ~18s          
  |+++++++                                           | 13% ~18s          
  |++++++++                                          | 14% ~18s          
  |++++++++                                          | 15% ~18s          
  |+++++++++                                         | 16% ~17s          
  |+++++++++                                         | 18% ~17s          
  |++++++++++                                        | 19% ~17s          
  |++++++++++                                        | 20% ~17s          
  |+++++++++++                                       | 21% ~17s          
  |+++++++++++                                       | 22% ~16s          
  |++++++++++++                                      | 23% ~16s          
  |++++++++++++                                      | 24% ~16s          
  |+++++++++++++                                     | 25% ~16s          
  |+++++++++++++                                     | 26% ~15s          
  |++++++++++++++                                    | 27% ~15s          
  |++++++++++++++                                    | 28% ~15s          
  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~15s          
  |++++++++++++++++                                  | 31% ~14s          
  |++++++++++++++++                                  | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~14s          
  |++++++++++++++++++                                | 35% ~13s          
  |+++++++++++++++++++                               | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |++++++++++++++++++++                              | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~13s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |+++++++++++++++++++++++                           | 44% ~12s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |+++++++++++++++++++++++++                         | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |++++++++++++++++++++++++++                        | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~12s          
  |++                                                | 2 % ~12s          
  |++                                                | 3 % ~12s          
  |+++                                               | 4 % ~12s          
  |+++                                               | 5 % ~11s          
  |++++                                              | 7 % ~11s          
  |++++                                              | 8 % ~11s          
  |+++++                                             | 9 % ~11s          
  |+++++                                             | 10% ~11s          
  |++++++                                            | 11% ~11s          
  |+++++++                                           | 12% ~10s          
  |+++++++                                           | 13% ~10s          
  |++++++++                                          | 14% ~10s          
  |++++++++                                          | 15% ~10s          
  |+++++++++                                         | 16% ~10s          
  |+++++++++                                         | 18% ~10s          
  |++++++++++                                        | 19% ~10s          
  |++++++++++                                        | 20% ~10s          
  |+++++++++++                                       | 21% ~10s          
  |+++++++++++                                       | 22% ~09s          
  |++++++++++++                                      | 23% ~09s          
  |+++++++++++++                                     | 24% ~09s          
  |+++++++++++++                                     | 25% ~09s          
  |++++++++++++++                                    | 26% ~09s          
  |++++++++++++++                                    | 27% ~09s          
  |+++++++++++++++                                   | 29% ~09s          
  |+++++++++++++++                                   | 30% ~09s          
  |++++++++++++++++                                  | 31% ~08s          
  |++++++++++++++++                                  | 32% ~08s          
  |+++++++++++++++++                                 | 33% ~08s          
  |++++++++++++++++++                                | 34% ~08s          
  |++++++++++++++++++                                | 35% ~08s          
  |+++++++++++++++++++                               | 36% ~08s          
  |+++++++++++++++++++                               | 37% ~08s          
  |++++++++++++++++++++                              | 38% ~07s          
  |++++++++++++++++++++                              | 40% ~07s          
  |+++++++++++++++++++++                             | 41% ~07s          
  |+++++++++++++++++++++                             | 42% ~07s          
  |++++++++++++++++++++++                            | 43% ~07s          
  |++++++++++++++++++++++                            | 44% ~07s          
  |+++++++++++++++++++++++                           | 45% ~07s          
  |++++++++++++++++++++++++                          | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |+++++++++++++++++++++++++                         | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~06s          
  |++++++++++++++++++++++++++                        | 51% ~06s          
  |++++++++++++++++++++++++++                        | 52% ~06s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |+++++++++++++++++++++++++++                       | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |+++++++++++++++++++++++++++++                     | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |++++++++++++++++++++++++++++++                    | 58% ~05s          
  |++++++++++++++++++++++++++++++                    | 59% ~05s          
  |+++++++++++++++++++++++++++++++                   | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=12s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |++                                                | 2 % ~10s          
  |++                                                | 3 % ~10s          
  |+++                                               | 4 % ~10s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |+++++                                             | 9 % ~09s          
  |+++++                                             | 10% ~09s          
  |++++++                                            | 11% ~08s          
  |++++++                                            | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |+++++++                                           | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |++++++++                                          | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |+++++++++++                                       | 20% ~07s          
  |+++++++++++                                       | 21% ~07s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~07s          
  |++++++++++++++++                                  | 31% ~06s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |+++++++++++++++++++                               | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |++++++++++++++++++++++                            | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |++++++++++++++++++++++++                          | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |+++++++++++++++++++++++++++++                     | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~18s          
  |+                                                 | 2 % ~17s          
  |++                                                | 3 % ~17s          
  |++                                                | 4 % ~16s          
  |+++                                               | 5 % ~16s          
  |+++                                               | 6 % ~16s          
  |++++                                              | 7 % ~16s          
  |++++                                              | 8 % ~15s          
  |+++++                                             | 9 % ~15s          
  |+++++                                             | 10% ~15s          
  |++++++                                            | 11% ~15s          
  |++++++                                            | 12% ~15s          
  |+++++++                                           | 13% ~15s          
  |+++++++                                           | 14% ~14s          
  |++++++++                                          | 15% ~14s          
  |++++++++                                          | 16% ~14s          
  |+++++++++                                         | 17% ~14s          
  |+++++++++                                         | 18% ~14s          
  |++++++++++                                        | 19% ~14s          
  |++++++++++                                        | 20% ~13s          
  |+++++++++++                                       | 21% ~13s          
  |+++++++++++                                       | 22% ~13s          
  |++++++++++++                                      | 23% ~13s          
  |++++++++++++                                      | 24% ~13s          
  |+++++++++++++                                     | 25% ~13s          
  |+++++++++++++                                     | 26% ~12s          
  |++++++++++++++                                    | 27% ~12s          
  |++++++++++++++                                    | 28% ~12s          
  |+++++++++++++++                                   | 29% ~12s          
  |+++++++++++++++                                   | 30% ~12s          
  |++++++++++++++++                                  | 31% ~12s          
  |++++++++++++++++                                  | 32% ~11s          
  |+++++++++++++++++                                 | 33% ~11s          
  |+++++++++++++++++                                 | 34% ~11s          
  |++++++++++++++++++                                | 35% ~11s          
  |++++++++++++++++++                                | 36% ~11s          
  |+++++++++++++++++++                               | 37% ~11s          
  |+++++++++++++++++++                               | 38% ~10s          
  |++++++++++++++++++++                              | 39% ~10s          
  |++++++++++++++++++++                              | 40% ~10s          
  |+++++++++++++++++++++                             | 41% ~10s          
  |+++++++++++++++++++++                             | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |++++++++++++++++++++++                            | 44% ~09s          
  |+++++++++++++++++++++++                           | 45% ~09s          
  |+++++++++++++++++++++++                           | 46% ~09s          
  |++++++++++++++++++++++++                          | 47% ~09s          
  |++++++++++++++++++++++++                          | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~09s          
  |+++++++++++++++++++++++++                         | 50% ~08s          
  |++++++++++++++++++++++++++                        | 51% ~08s          
  |++++++++++++++++++++++++++                        | 52% ~08s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |+++++++++++++++++++++++++++                       | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |++++++++++++++++++++++++++++                      | 56% ~07s          
  |+++++++++++++++++++++++++++++                     | 57% ~07s          
  |+++++++++++++++++++++++++++++                     | 58% ~07s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |+++++++++++++++++++++++++++++++                   | 62% ~06s          
  |++++++++++++++++++++++++++++++++                  | 63% ~06s          
  |++++++++++++++++++++++++++++++++                  | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=17s  
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~19s          
  |+++                                               | 5 % ~18s          
  |++++                                              | 6 % ~18s          
  |++++                                              | 7 % ~18s          
  |+++++                                             | 8 % ~18s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 10% ~17s          
  |++++++                                            | 11% ~17s          
  |+++++++                                           | 12% ~17s          
  |+++++++                                           | 13% ~17s          
  |++++++++                                          | 14% ~17s          
  |++++++++                                          | 15% ~16s          
  |+++++++++                                         | 16% ~16s          
  |+++++++++                                         | 18% ~16s          
  |++++++++++                                        | 19% ~16s          
  |++++++++++                                        | 20% ~15s          
  |+++++++++++                                       | 21% ~15s          
  |+++++++++++                                       | 22% ~15s          
  |++++++++++++                                      | 23% ~15s          
  |++++++++++++                                      | 24% ~15s          
  |+++++++++++++                                     | 25% ~15s          
  |+++++++++++++                                     | 26% ~14s          
  |++++++++++++++                                    | 27% ~14s          
  |++++++++++++++                                    | 28% ~14s          
  |+++++++++++++++                                   | 29% ~14s          
  |+++++++++++++++                                   | 30% ~13s          
  |++++++++++++++++                                  | 31% ~13s          
  |++++++++++++++++                                  | 32% ~13s          
  |+++++++++++++++++                                 | 33% ~13s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 35% ~12s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 37% ~12s          
  |++++++++++++++++++++                              | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~12s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |++++++++++++++++++++++                            | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~10s          
  |++++++++++++++++++++++++                          | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |+++++++++++++++++++++++++                         | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |++++++++++++++++++++++++++                        | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |+++++++++++++++++++++++++++                       | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |+++++++++++++++++++++++++++++                     | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s  
Calculating cluster 11

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 5 % ~08s          
  |+++                                               | 6 % ~08s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 12

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~15s          
  |++                                                | 2 % ~14s          
  |++                                                | 3 % ~14s          
  |+++                                               | 4 % ~14s          
  |+++                                               | 5 % ~14s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 9 % ~13s          
  |+++++                                             | 10% ~13s          
  |++++++                                            | 11% ~13s          
  |++++++                                            | 12% ~13s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |++++++++                                          | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 18% ~12s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 22% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |+++++++++++++                                     | 24% ~11s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |++++++++++++++++++++                              | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~08s          
  |+++++++++++++++++++++                             | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~08s          
  |++++++++++++++++++++++++                          | 47% ~08s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |++++++++++++++++++++++++++++                      | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 13

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |+                                                 | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |++                                                | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |+++                                               | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |+++++                                             | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |++++++                                            | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |++++++++++++++++++                                | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |+++++++++++++++++++++                             | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
# optional: save the cluster markers
#write.csv(ClusterMarkers,"ClusterMarkers.csv")

See the top cluster markers

Now we can look at the cluster markers for cluster using EnrichR to compare to reference libraries



setEnrichrSite("Enrichr") # Human genes
Connection changed to https://maayanlab.cloud/Enrichr/
Connection is Live!
# list of all the databases

dbs <- listEnrichrDbs()

# this will list the possible libraries
dbs

# select libraries with cell types
db <- c('CellMarker_Augmented_2021','Azimuth_Cell_Types_2021')

Here is a small function to run easily on each cluster and find the cell type library predictions (specific to the libraries I selected)


checkCelltypes <- function(cluster_num = 0){
  clusterX <- ClusterMarkers %>% filter(cluster == cluster_num & avg_log2FC > 0.25)
  genes <- clusterX$gene
  # the cell type libraries
  # get the results for each library
  clusterX.cell <- enrichr(genes, databases = db)
  # visulize the results
print(plotEnrich(clusterX.cell[[1]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'CellMarker_Augmented_2021'))
print(plotEnrich(clusterX.cell[[2]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'Azimuth_Cell_Types_2021'))

}

Run the function for each cluster to see if we can identify cell types


cluster0 <- checkCelltypes(cluster_num = 0)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

Cluster 0 is likely immature neurons - possibly both Glutamatergic and gabaergic

Cluster 1 is astrocytes


checkCelltypes(cluster_num = 11)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

After we have looked at all the clusters we add manual annotations

levels(integrated_seurat)
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13"

Lets look at the annotations on the UMAP


DimPlot(integrated_seurat, group.by = "CellTypes", label = TRUE)

BREAK

Automated annotation We require reference data objects for both methods we will use


# developing forebrain
devforebrain <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/PublicData/Karolinski_DevForebrain_downsample_Level1.RDS")

# developing cortex

devcotex <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/PublicData/Nowakowski_dev_cortext.RDS")

# adult midbrain

midbrain <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/PublicData/KamathTotal_downsample.RDS")

#check the meta data
print("Developing Forebrain")
[1] "Developing Forebrain"
colnames(devforebrain@meta.data)
[1] "orig.ident"   "nCount_RNA"   "nFeature_RNA" "Sample"       "Level1"       "Age"         
[7] "Clusters"     "New"          "Celltypes"   
print("Developing cortex")
[1] "Developing cortex"
colnames(devcotex@meta.data)
 [1] "orig.ident"   "nCount_RNA"   "nFeature_RNA" "WGCNAcluster" "Name"         "Age_in_Weeks"
 [7] "RegionName"   "Laminae"      "Area"         "Celltypes"   
print("Adult midbrain")
[1] "Adult midbrain"
colnames(midbrain@meta.data)
[1] "orig.ident"              "nCount_RNA"              "nFeature_RNA"           
[4] "Cell_Subtype"            "Cell_Type"               "disease__ontology_label"
[7] "organ__ontology_label"  
# we need to know the metadata slot name to use

Seurat label transfer using find anchors - predicts cell types from a reference Seurat object

scClassify R weighted kNN https://doi.org/10.15252/msb.20199389 https://sydneybiox.github.io/scClassify/articles/scClassify.html

We need to make the reference and query objects into a “dgCMatrix” object

length(query_clusters)
[1] 4028

See the original cell type annotations

query_celltypes[1:10]
AAACCCAAGAGCTTTC-1_1 AAACCCACATTGACTG-1_1 AAACCCAGTTTGGAAA-1_1 AAACCCATCATCGACA-1_1 
    neurons_immature         astrocytes_1        endothelial_2          astrocyte_2 
AAACGAAAGCCTGAAG-1_1 AAACGAAAGGAGAATG-1_1 AAACGAACACGCGTGT-1_1 AAACGCTCACGTTCGG-1_1 
       endothelial_1            DAneurons       neurons_mature       neurons_mature 
AAACGCTGTTGTCAGT-1_1 AAAGAACAGGTAGGCT-1_1 
        neurons_GABA       neurons_mature 
14 Levels: neurons_immature astrocytes_1 glia neurons_mature OPC ... DAneurons

Run scClassify


scClassify_res <- scClassify(exprsMat_train = dgCMat_ref,
                             cellTypes_train = ref_celltypes,
                             exprsMat_test = dgCMat_query,
                             cellTypes_test = query_celltypes,
                             tree = "HOPACH",
                             algorithm = "WKNN",
                             selectFeatures = c("limma"),
                             similarity = c("pearson"),
                             returnList = FALSE,
                             verbose = FALSE)
Warning in asMethod(object) :
  sparse->dense coercion: allocating vector of size 2.4 GiB


plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))
Warning: Removed 27 rows containing missing values (`geom_text()`).

See the cell type predictions by cluster

table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_celltypes)
                                            query_celltypes
                                             neurons_immature astrocytes_1 glia
  EN                                                       76            0    5
  Endothelial                                               0            0    0
  Glioblast                                                 0            0    0
  IN                                                      320            0    0
  Neuroblast                                               17            0    1
  Neuroblast_IN_EN                                        141            0    3
  Neuroblast_IN_EN_Neurons_U                                8            0    0
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U                0            0    0
  Neuroblast_IN_EN_NPC_Neurons_U                            0            0    0
  Neurons                                                   0            0    0
  NPC                                                       0            0    0
  OPC                                                       0            0    1
  Pre-OPC                                                   0          462  204
  RG                                                        0            2   66
  RG_Glioblast                                              0            0    1
  RG_Glioblast_OPC_Pre-OPC                                  0            0    1
  RG_Glioblast_Pre-OPC                                      0           51  127
  U                                                         0            0    0
  unassigned                                                4            3   29
  VLMC                                                      0            0    0
                                            query_celltypes
                                             neurons_mature OPC endothelial_1 endothelial_2
  EN                                                     18   7             9           178
  Endothelial                                             0   0             0             0
  Glioblast                                               0   1             7             2
  IN                                                    280   0             0             7
  Neuroblast                                              0   1             1             2
  Neuroblast_IN_EN                                       90   4             2            22
  Neuroblast_IN_EN_Neurons_U                              0   0             0             1
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U              0   0             0             1
  Neuroblast_IN_EN_NPC_Neurons_U                          0   0             2             1
  Neurons                                                 0   0             0             1
  NPC                                                     0   0             0             0
  OPC                                                     0   6             0             0
  Pre-OPC                                                 0 171            23             0
  RG                                                      0  24           122            15
  RG_Glioblast                                            0   7            30             3
  RG_Glioblast_OPC_Pre-OPC                                0   9             0             0
  RG_Glioblast_Pre-OPC                                    0  53            12             0
  U                                                       0   0             0             0
  unassigned                                              1  24            72            22
  VLMC                                                    0   0             0             0
                                            query_celltypes
                                             astrocyte_2 RadialGlia neurons1 neurons_GABA
  EN                                                   4          0      202           50
  Endothelial                                          0          0        0            1
  Glioblast                                            2          0        0            1
  IN                                                   0          0        0           80
  Neuroblast                                           0          0        4            6
  Neuroblast_IN_EN                                     3          2       11           50
  Neuroblast_IN_EN_Neurons_U                           0          0        8            0
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U           0          0        0            0
  Neuroblast_IN_EN_NPC_Neurons_U                       0          0        0            2
  Neurons                                              1          0        0            0
  NPC                                                  0          0        0            0
  OPC                                                  0          0        0            0
  Pre-OPC                                            144         60        0            1
  RG                                                  19         89        0            3
  RG_Glioblast                                        13         17        0            1
  RG_Glioblast_OPC_Pre-OPC                             5          1        0            0
  RG_Glioblast_Pre-OPC                                45         37        0            1
  U                                                    0          0        2            0
  unassigned                                          17         13        0           12
  VLMC                                                 0          8        0            0
                                            query_celltypes
                                             neurons2 neural_stem DAneurons
  EN                                              102           0        63
  Endothelial                                       0           0         0
  Glioblast                                         0           2         0
  IN                                                4           2         0
  Neuroblast                                       15           0         0
  Neuroblast_IN_EN                                 64           0         3
  Neuroblast_IN_EN_Neurons_U                        1           0         0
  Neuroblast_IN_EN_NPC_Endothelial_Neurons_U        0           0         0
  Neuroblast_IN_EN_NPC_Neurons_U                    3           0         2
  Neurons                                           0           0         0
  NPC                                               2           0         0
  OPC                                               0           2         0
  Pre-OPC                                           0           4         0
  RG                                                0          61         0
  RG_Glioblast                                      0          10         0
  RG_Glioblast_OPC_Pre-OPC                          0           0         0
  RG_Glioblast_Pre-OPC                              0          11         0
  U                                                 0           0         0
  unassigned                                        1           6         2
  VLMC                                              0           0         0

Check another reference set

# refrence data
# we have the data prepared as a Seurat object

ref2 <- midbrain
ref2

#check the meta data
colnames(ref2@meta.data)

#make the reference matrix and reference cell types 


dgCMat_ref2 <- GetAssayData(ref2)
# get the cell type data
Idents(ref2) <- "Cell_Type" 
ref_celltypes2 <- Idents(ref2)
unique(ref_celltypes2)

# check the object
dim(dgCMat_ref2)


class(dgCMat_ref2)
# predict the cluster cell types from the second reference
scClassify_res <- scClassify(exprsMat_train = dgCMat_ref2,
                             cellTypes_train = ref_celltypes2,
                             exprsMat_test = dgCMat_query,
                             cellTypes_test = query_clusters,
                             tree = "HOPACH",
                             algorithm = "WKNN",
                             selectFeatures = c("limma"),
                             similarity = c("pearson"),
                             returnList = FALSE,
                             verbose = FALSE)
Sys.time()

plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))

See the predictions by cluster

table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_clusters)
# reformat to see the top predictions for each cluster

pred_counts <- as.data.frame(table(query_clusters,scClassify_res$testRes$test$pearson_WKNN_limma$predRes))

pred_counts$Freq <- as.double(pred_counts$Freq)

head(pred_counts)
# see predictions by cluster in a table
top.pred <- as.data.frame(pred_counts  %>% group_by(query_clusters)  %>% top_n(2, Freq)) %>% arrange(query_clusters, desc(Freq))
top.pred

Add prediction annotations

Adjust annotations - merge clusters or not

LS0tCnRpdGxlOiAic2NSTkFzZXEgV29ya2Zsb3ciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgd29ya2Jvb2sgaW5jbHVkZXM6CjEuIENyZWF0aW5nIGEgU2V1cmF0IG9iamVjdCBmcm9tIENlbGxSYW5nZXIgb3V0cHV0LgoyLiBQcmVwYXJpbmcgYW5kIGNsZWFuaW5nIHRoZSBkYXRhCiAgYSkgVmlzdWFsaXplIFFDCiAgYikgRmlsdGVyIG91dCB1bndhbnRlZCBjZWxscwogIGMpIElkZW50aWZ5IGFuZCByZW1vdmUgZG91YmxldHMKICBkKSBOb3JtYWxpemF0aW9uIGFuZCBzY2FsZQogIGUpIFNlbGVjdCBWYXJpYWJsZSBmZWF0dXJlcwozLiBNZXJnaW5nIGFuZCBIYXJtb25pemluZyBzYW1wbGVzCiAgYSkgTWVyZ2Ugc2FtcGxlcwogIGIpIFVzZSBTZXVyYXQgZmluZCBhbmNob3JzIHRvIGludGVncmF0ZQogIGMpIENvbXBhcmUgbWVyZ2VkIHZzIGludGVncmF0ZWQKNC4gRGltZW5zaW9uYWwgcmVkdWN0aW9uIGNsdXN0ZXJpbmcgYW5kIHZpc3VhbGl6YXRpb24KICBhKSBQQ0EgYW5kIGNvbXBvbmVudCBzZWxlY3Rpb24KICBiKSBVTUFQCiAgYykgQ2x1c3RlcmluZyBhbmQgdmlzdWFsaXphdGlvbgo1LiBDbHVzdGVyIGFubm90YXRpb24KICBhKSBWaXN1YWxpemUgZXhwcmVzc2lvbiBvZiBrbm93biBjZWxsIHR5cGUgbWFya2VycwogIGIpIEZpbmQgY2x1c3RlciBtYXJrZXJzIGFuZCBsb29rIHRoZW0gdXAgaW4gcmVmZXJlbmNlIGNlbGwgdHlwZSBsaWJyYXJ5CiAgYykgTWFudWFsIGNsdXN0ZXIgYW5ub3RhdGlvbiAKICBkKSBEZWNpc2lvbnMgb24gbWVyZ2luZyBjbHVzdGVycwo2LiBBdXRvbWF0ZWQgY2x1c3RlciBhbm5vdGF0aW9uCiAgYSkgU2V1cmF0IGxhYmVsIHRyYW5zZmVyCiAgYikgc2NDbGFzc2lmeQoKCiMgRXhhbXBsZSBkYXRhCldlIHdpbGwgdXNlIGRhdGEgZnJvbSBpUFNDIGRlcml2ZWQgbWlkYnJhaW4gb3JnYW5vaWRzClRoZXJlIGFyZSB0d28gc2FtcGxlcyBmcm9tIGRpc3NvY2lhdGVkIG1pZGJyYWluIG9yZ2Fub2lkcwoxKSBpUFNDIGxpbmUgZnJvbSBhIHBhdGllbnQgd2l0aCBQYXJraW5zb24ncyBEaXNlYXNlIGNhcnJ5aW5nIGEgdHJpcGxpY2F0aW9uIG9mIHRoZSBnZW5lIFNOQ0EKMikgVGhlIHNhbWUgaVBTQyBsaW5lIENSSVNQUiBjb3JyZWN0ZWQgdG8gbWFrZSBhbiBpc29nZW5lbmljIGNvbnRyb2wKCgojIEFuYWx5c2lzIHdvcmtmbG93CgpMb2FkIHlvdXIgcmVxdWlyZWQgbGlicmFyaWVzLgpZb3UgbmVlZCB0byBoYXZlIHRoZXNlIGxpYnJhcmllcyBhbHJlYWR5IGluc3RhbGxlZC4gCgpgYGB7cn0KU3lzLnRpbWUoKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRG91YmxldEZpbmRlcikKbGlicmFyeShlbnJpY2hSKQpsaWJyYXJ5KGNsdXN0cmVlKQpsaWJyYXJ5KCJzY0NsYXNzaWZ5IikKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKbGlicmFyeSgiTWF0cml4IikKCgpgYGAKCgpMb2FkIHRoZSBkYXRhOiBTdGFydGluZyB3aXRoIHRoZSBjb250cm9sIGRhdGEuCgpgYGB7cn0KIyBsb2FkIGRhdGEKCiMgcmVhZCBpbiB0aGUgZGF0YSAtIENlbGxSYW5nZXIgb3V0cHV0IC0gYmFyY29kZXMsIGZlYXR1cmVzLCBleHByZXNzaW9uIG1hdHJpeAoKIyB5b3UgbmVlZCB0byBlbnRlciB0aGUgZmlsZSBwYXRoIHRvIHRoZSBmb2xkZXIgd2l0aCB0aGUgdGhyZWUgZmlsZXMKY29uX2RhdGEgPC0gUmVhZDEwWCgiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvQVNUMjNfQnJhaW5Db21tL0NlbGxSYW5nZXJPdXRzL0FTVDIzaXNvZ2VuaWMvcmF3X2ZlYXR1cmVfYmNfbWF0cml4IikgCgojTG9vayBhdCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgbWF0cml4CmRpbShjb25fZGF0YSkKCiNMb29rIGF0IGEgc21hbGwgcGFydCBvZiB0aGUgZGF0YQpjb25fZGF0YVsxOjUsIDE6NV0KCiNMb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBVTUlzIHBlciBjZWxsCmNvbFN1bXMoY29uX2RhdGEpICU+JSBzdW1tYXJ5CiNMb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZiBnZW5lcyBwZXIgY2VsbCAgCmNvbFN1bXMoY29uX2RhdGEgPiAwKSAlPiUgc3VtbWFyeQoKCgpgYGAKCgpSZW1vdmUgYmFyY29kZXMgd2l0aCB0b28gZmV3IGdlbmVzIHRoYXQgY291bGQgYmUgZW1wdHkgZHJvcGxldHMKCmBgYHtyfQojUmVtb3ZlIGJhcmNvZGVzIHdpdGggbGVzcyB0aGFuIDEwMCBnZW5lcyBkZXRlY3RlZCAoeW91IGNhbiBzZWxlY3QgYSBkaWZmZXJlbnQgdmFsdWUgaGVyZSkKIyB3aXRob3V0IApjb25fZGF0YSA8LSBjb25fZGF0YVssIGNvbFN1bXMoY29uX2RhdGEgPiAwKT4gMTAwXQpkaW0oY29uX2RhdGEpCmNvbFN1bXMoY29uX2RhdGEpICU+JSBzdW1tYXJ5CgpgYGAKCgpGaWx0ZXIgZ2VuZXMgYW5kIGNyZWF0ZSBhIFNldXJhdCBvYmplY3QKCgpgYGB7cn0KI1dlIG1pZ2h0IG5vdCB3YW50IHRvIGluY2x1ZGUgZ2VuZXMgdGhhdCBvY2N1ciBpbiBmZXcgY2VsbHMgYXJlIG5vIGNlbGxzLiAgSGVyZSB3ZSB3aWxsIGZpbHRlciBvdXQgZ2VuZXMvdHJhbnNjcmlwdHMgdGhhdCBhcmUgaW4gbGVzcyB0aGFuIDMgY2VsbHMuIAojIHlvdSBkb24ndCBoYXZlIHRvIGZpbHRlciBhbnkgZ2VuZXMgeW91IGNhbiBhbHNvIGNoYW5nZSB0byBhbnkgZmlsdGVyIHRocmVzaG9sZCB5b3Ugd2FudAoKI01ha2UgYSBTZXVyYXQgb2JqZWN0CiNSZW1vdmluZyBhbnkgZ2VuZXMgZGV0ZWN0ZWQgaW4gbGVzcyB0aGFuIDMgY2VsbHMKCiMgd2UgY2FuIGFsc28gZmlsdGVyIGNlbGxzIGF0IHRoaXMgc3RhZ2UgdG9vLiAKY29uX3NldSA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY29uX2RhdGEsIHByb2plY3QgPSAiQ29udHJvbCIsIG1pbi5jZWxscyA9IDMpCiMgbG9vayBhdCB0aGUgb2JqZWN0IGRpbWVuc2lvbnMKY29uX3NldQoKYGBgCgoKRGF0YSBkaXN0cmlidXRpb24KYGBge3J9CiMgbG9vayBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRvdGFsIGNvdW50cyBvZiBSTkEgYWNyb3NzIGNlbGxzCmNvbl9zZXUkbkNvdW50X1JOQSAlPiUgc3VtbWFyeQoKIyBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdW5pcXVlIFJOQSB0cmFuc2NyaXB0cyBhY3Jvc3MgY2VsbHMKCmNvbl9zZXUkbkZlYXR1cmVfUk5BICU+JSBzdW1tYXJ5CgpgYGAKCgpWaXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbnMKCmBgYHtyfQoKVmxuUGxvdChjb25fc2V1LCBmZWF0dXJlcyA9IGMoIm5Db3VudF9STkEiLCJuRmVhdHVyZV9STkEiKSwgcHQuc2l6ZSA9IDApCgpgYGAKCkZpbHRlciBvdXQgdW53YW50ZWQgY2VsbHMKCmBgYHtyfQojIEV4YW1wbGUgY2VsbCBmaWx0ZXJpbmcgYmFzZWQgb24gbWl0b2Nob25kcmlhbCBjb3VudCBwZXJjZW50YWdlIGFuZCBudW1iZXIgb2YgVU1JcyAtLS0tLS0tLS0tCgojQ2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIG9mIFJOQSBlbmNvZGVkIG1pdG9jaG9uZHJpYWwgZ2VuZXMgZnJvbSB0aGUgbWl0b2Nob25kcmlhbCBETkEKY29uX3NldSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChjb25fc2V1LCBwYXR0ZXJuID0gIl5NVC0iLCBjb2wubmFtZSA9ICJwZXJjZW50Lk1UIikKY29uX3NldSRwZXJjZW50Lk1UICU+JSBzdW1tYXJ5CgpWbG5QbG90KGNvbl9zZXUsIGZlYXR1cmVzID0gInBlcmNlbnQuTVQiLCBwdC5zaXplID0gMC4wMDEpCgpgYGAKTm93IHdlIHdpbGwgZmlsdGVyIHNvbWUgY2VsbHMgd2l0aCB0b28gaGlnaCBtaXRvY2hvbmRyaWFsIFJOQQpGaWx0ZXIgb3V0IGNlbGxzIHdpdGggdG9vIG1hbnkgUk5BIHJlYWRzIC0gdGhlc2UgYXJlIGxpa2VseSBkb3VibGV0cwoKYGBge3J9CgoKI1JlbW92ZSBhbnkgY2VsbHMgd2l0aCBtb3JlIHRoYW4gMjAlIG1pdG9jaG9uZHJpYWwgY291bnRzCmNvbl9zZXUuZnQgPC0gc3Vic2V0KGNvbl9zZXUsIHBlcmNlbnQuTVQgPCAyMCkKCiNSZW1vdmUgY2VsbHMgd2l0aCB2ZXJ5IGhpZ2ggVU1JIGNvdW50cywgd2hpY2ggbWF5IGJlIHBvc3NpYmxlIG11bHRpcGxldHMKY29uX3NldS5mdCA8LSBzdWJzZXQoY29uX3NldS5mdCwgbkNvdW50X1JOQSA8IDIwMDAwKQoKIyBzZWUgdGhlIHJlc3VsdHMKVmxuUGxvdChjb25fc2V1LmZ0LCBmZWF0dXJlcyA9IGMoInBlcmNlbnQuTVQiLCAibkNvdW50X1JOQSIsICJuRmVhdHVyZV9STkEiKSwgcHQuc2l6ZSA9IDAuMDAxKQoKIyBjaGVjayBob3cgbWFueSBjZWxscyB3ZSBoYXZlCmNvbl9zZXUuZnQKClZsblBsb3QoY29uX3NldS5mdCwgZmVhdHVyZXMgPSAibkZlYXR1cmVfUk5BIiwgcHQuc2l6ZSA9IDAuMDAxLCB5Lm1heCA9IDEwMDApCgoKYGBgCgpXZSBtaWdodCB3YW50IHRvIGZpbHRlciBtb3JlIGNlbGxzIHdpdGggbG93IHRvdGFsIGFuZC9vciB1bmlxdWUgUk5BCgpgYGB7cn0KCiMgdHJ5IHNvbWUgZGlmZmVyZW50IGZpbHRlcmluZyBvcHRpb25zCmNvbl9zZXUuZnQgPC0gc3Vic2V0KGNvbl9zZXUsIHBlcmNlbnQuTVQgPCAyMCkKZGltKGNvbl9zZXUpCmRpbShjb25fc2V1LmZ0KQoKCmBgYAoKQXBwbHkgZmluYWwgZmlsdGVyaW5nIGNvbmRpdGlvbnMKYGBge3J9Cgpjb25fc2V1X2Z0IDwtIHN1YnNldChjb25fc2V1LCBuQ291bnRfUk5BIDwgNjAwMDAgJiBuRmVhdHVyZV9STkEgPiA1MDAgJiAKICAgICAgICAgICAgICAgICAgICAgcGVyY2VudC5NVCA8IDIwKQoKZGltKGNvbl9zZXVfZnQpCgpgYGAKCkNsZWFyIGV4dHJhIGRhdGEgb2JqZWN0IHdlIGRvbid0IG5lZWQgYW55bW9yZQoKYGBge3J9CgpybShjb25fZGF0YSxjb25fc2V1LmZ0KQoKYGBgCgoKTm9ybWFsaXppbmcgCgpgYGB7cn0KIyBOb3JtYWxpemUgZGF0YSAobG9nIG5vcm1hbGl6YXRpb24pIGFuZCBzZWxlY3QgZ2VuZXMgd2l0aCB2YXJpYWJsZSBleHByZXNzaW9uIGFjcm9zcyBjZWxscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY29uX3NldV9mdCA8LSBOb3JtYWxpemVEYXRhKGNvbl9zZXVfZnQsIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsIHNjYWxlLmZhY3RvciA9IDEwMDAwKQoKI0NoZWNrIG91dCB0aGUgZWZmZWN0IG9mIG5vcm1hbGl6YXRpb24KR2V0QXNzYXlEYXRhKGNvbl9zZXVfZnQsIGFzc2F5ID0gIlJOQSIsIHNsb3QgPSAiZGF0YSIpICU+JSBleHBtMSAlPiUgY29sU3VtcyAlPiUgaGVhZApHZXRBc3NheURhdGEoY29uX3NldV9mdCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJjb3VudHMiKSAlPiUgY29sU3VtcyAlPiUgaGVhZAoKYGBgCgpGaW5kaW5nIFZhcmlhYmxlIGZlYXR1cmVzIApgYGB7cn0KIyB0aHJlZSBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gY2hvb3NlIHZhcmlhYmxlIGZlYXR1cmVzIGluIHRoaXMgZnVuY3Rpb24KIyBvdXIgc2VsZWN0aW9uIG1ldGhvZCBpcyB2c3QKY29uX3NldV9mdCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhjb25fc2V1X2Z0LCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCgoKdmFyICA8LSBWYXJpYWJsZUZlYXR1cmVzKGNvbl9zZXVfZnQpClZhcmlhYmxlRmVhdHVyZVBsb3QoY29uX3NldV9mdCkKdmFyWzE6MTBdCgoKCmBgYAoKRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIFBDQSBhbmQgVU1BUAoKYGBge3J9CiNTY2FsaW5nIGlzIHJlY29tbWVuZGVkIGJlZm9yZSBQQ0EsIGFzIG90aGVyd2lzZSBoaWdobHkgZXhwcmVzc2VkIGdlbmVzIHdpbGwgaGF2ZSBhIGRpc3Byb3BvcnRpb25hdGUgZWZmZWN0IG9uIHRoZSBQQyBjb21wb3NpdGlvbgoKIyB3ZSBhcmUgYWxzbyByZWdyZXNzaW5nIE1UIGdlbmVzIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIFBDQQpjb25fc2V1X2Z0IDwtIFNjYWxlRGF0YShjb25fc2V1X2Z0LCB2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5NVCIpCmNvbl9zZXVfZnRAYXNzYXlzJFJOQUBzY2FsZS5kYXRhICU+JSBkaW0KCiNMaW5lYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCiNDaG9vc2luZyB0aGUgbnVtYmVyIG9mIFBDcyBjYW4gZGVwZW5kIG9uIGhvdyBtYW55IGNlbGxzIHlvdSBoYXZlCmNvbl9zZXVfZnQgPC0gUnVuUENBKGNvbl9zZXVfZnQsIGFzc2F5ID0gIlJOQSIsIG5wY3MgPSAzMCkKClBDQVBsb3QoY29uX3NldV9mdCkKCiNBc3Nlc3MgaG93IG1hbnkgUENzIGNhcHR1cmUgbW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgCkVsYm93UGxvdChjb25fc2V1X2Z0LCBuZGltcyA9IDMwKQoKYGBgCgpXZSB3b24ndCBydW4gdGhpcyBjb2RlCkkndmUgaW5jbHVkZWQgdGhpcyBhbmFseXNpcyB0aGF0IGNhbGN1bGF0ZXMgdGhlIGN1dC1vZmYgZm9yIHNpZ25pY2FuY2Ugb2YgY29tcG9uZW50IG51bWJlcnMuICBIb3dldmVyIHRoZSBmdW5jdGlvbiBydW5zIG11bHRpcGxlIGl0ZXJhdGlvbnMgb2YgdGhlIFBDQSBhbmQgd2lsbCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJ1bi4gCgpgYGB7cn0KIyBKYWNrc3RyYXcKCiNBc3Nlc3MgaG93IG1hbnkgUENzIGNhcHR1cmUgbW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgCnNldSA8LUphY2tTdHJhdyhzZXUsIHJlZHVjdGlvbiA9ICJwY2EiLAogIGRpbXMgPSAzMCkKc2V1IDwtIFNjb3JlSmFja1N0cmF3KHNldSwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpKYWNrU3RyYXdQbG90KHNldSwgZGltcyA9IDE6MzApCgpgYGAKCgpOb24tbGluZWFyIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiB1c2luZyBVTUFQCmBgYHtyfQoKI05vbi1saW5lYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCiNDaG9vc2luZyBob3cgbWFueSBQQ3MgdG8gaW5wdXQgY2FuIGRlcGVuZCBvbiB0aGUgZWxib3cgcGxvdCBhbmQgb24gdGhlIG51bWJlciBvZiBjZWxscwojVGhlcmUgYXJlIG1hbnkgcGFyYW1ldGVycyB0aGF0IGNhbiBlIHR3ZWFrZWQgYW5kIG9wdGltaXplZCBpbiBhIFVNQVAgcGxvdAojWW91IGNhbiBzZWUgc29tZSBkZW1vcyBoZXJlOiBodHRwczovL3BhaXItY29kZS5naXRodWIuaW8vdW5kZXJzdGFuZGluZy11bWFwLwpjb25fc2V1X2Z0IDwtIFJ1blVNQVAoY29uX3NldV9mdCwgZGltcyA9IDE6MTgpClVNQVBQbG90KGNvbl9zZXVfZnQpCgoKYGBgCgoKRG91YmxldCBpZGVudGlmaWNhdGlvbgoKYGBge3J9CgojIEFzc2VzcyBwb3NzaWJsZSBkb3VibGV0cyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI1VzaW5nIGluc3RydWN0aW9ucyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXMtbWNnaW5uaXMtdWNzZi8KCiNGaXJzdCB3ZSBoYXZlIHRvIGZpbmQgYSBwSyB3aGljaCBkZXRlcm1pbmVzIGhvdyBiaWcgb2YgYSBuZWlnaGJvcmhvb2Qgd2lsbCBiZSBleGFtaW5lZCBmb3IgZG91YmxldHMKI1RoaXMgc2hvdWxkIGJlIGNob3NlbiBmb3IgZWFjaCBsaWJyYXJ5IHNlcGFyYXRlbHkKI0ZpcnN0IHdlIHRlc3QgYSBudW1iZXIgb2YgcE4gKHByb3BvcnRpb24gb2YgZ2VuZXJhdGVkIGFydGlmaWNpYWwgZG91YmxldHMpIGFuZCBwSwojV2UgZ2V0IGRpZmZlcmVudCBsaXN0cyBvZiBwcm9iYWJpbGl0aWVzIG9mIGFydGlmaWNhbCBuZWFyZXN0IG5laWdoYm9ycyB3aXRoIHRoZXNlIHRlc3RlZCBwYXJhbWV0ZXJzCiNBbHNvIGtlZXAgaW4gbWluZCB0aGUgcmVzdWx0cyBhcmUgbm90IGRldGVybWluaXN0aWMgKGV2ZXJ5IHJ1biB3aWxsIGdpdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHJlc3VsdHMpCnN3ZWVwLnJlcy5jb24gPC0gcGFyYW1Td2VlcF92Myhjb25fc2V1X2Z0LCBQQ3MgPSAxOjE4LCBzY3QgPSBGQUxTRSkKCiNXZSBkbyBub3QgaGF2ZSB0aGUgImdyb3VuZCB0cnV0aCIgcmVnYXJkaW5nIGRvdWJsZXRzLCBzdWNoIGZyb20gZnJvbSBnZW5vdHlwZSBkYXRhIGZvciBwb29sZWQgc2FtcGxlcyAKI1dlIHN1bWFtcml6ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIHJhbmdlIG9mIHBOPXBLIHBhcmFtZXRlcnMgd2UgdGVzdGVkCnN3ZWVwLnN0YXRzX2NvbiA8LSBzdW1tYXJpemVTd2VlcChzd2VlcC5yZXMuY29uLCBHVCA9IEZBTFNFKQoKI0hlcmUgdGhlICJiZXN0IiBwSyBmb3IgdGhlIGRhdGEgaXMgY2hvc2VuIGJhc2VkIG9uIGEgbWV0cmljIGRldGVybWluZWQgYnkgdGhlIERvdWJsZXRGaW5kZXIgZGV2ZWxvcGVycwojV2hpY2ggcGVyZm9ybXMgYmVzdCBpbiBkYXRhc2V0cyB3aGVyZSB0aGUgZ3JvdW5kIHRydXRoIGlzIGtub3duCmJjbXZuX2NvbiA8LSBmaW5kLnBLKHN3ZWVwLnN0YXRzX2NvbikKZ2dwbG90KGJjbXZuX2NvbiwgYWVzKHggPSBwSywgeSA9IEJDbWV0cmljLCBncm91cCA9ICJTd2VlcCIpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgpgYGB7cn0KCiNXZSB3aWxsIHBpY2sgcEsgPSAwLjA4CiNXZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBvdXIgY2x1c3RlcmluZyBpbmZvcm1hdGlvbiB0byBlc3RpbWF0ZSAiaG9tb3R5cGljIiBkb3VibGV0cwojV2UgYXJlIHNpbXBseSBnb2luZyB0byB1c2UgYW4gZXhwZWN0ZWQgZG91YmxldCBmb3JtYXRpb24gcmF0ZSBvZiAyLjUlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3RhcnRpbmcgY2VsbHMgbG9hZGVkCgpuRXhwX3BvaSA8LSByb3VuZCgwLjAyNSpucm93KGNvbl9zZXVfZnRAbWV0YS5kYXRhKSkKY29uX3NldV9mdCA8LSBkb3VibGV0RmluZGVyX3YzKGNvbl9zZXVfZnQsIFBDcyA9IDE6MTgsIHBOID0gMC4yNSwgcEsgPSAwLjA4LCBuRXhwID0gbkV4cF9wb2ksIHJldXNlLnBBTk4gPSBGQUxTRSwgc2N0ID0gRkFMU0UpCgojSGVyZSB3ZSB1cGRhdGUgdGhlIFNldXJhdCBvYmplY3QgdmVyc2lvbiBqdXN0IGluIGNhc2UgdGhlIG9uZSByZXR1cm5lZCBieSBEb3VibGV0RmluZGVyIGlzIGFuIG9sZGVyIHZlcnNpb24KY29uX3NldV9mdCA8LSBVcGRhdGVTZXVyYXRPYmplY3QoY29uX3NldV9mdCkKCiMgd2UgaGF2ZSBub3cgaWRlbnRpZmllZCBkb3VibGV0cyBidXQgd2UgaGF2ZSBub3QgcmVtb3ZlZCB0aGVtCgoKYGBgCgpWaXN1YWxpemUgdGhlIGRvdWJsZXQgcmVtb3ZhbCByZXN1bHRzCgpgYGB7cn0KCiMgd2UgbmVlZCB0byBsb29rIGluIHRoZSBkYXRhIG9iamVjdAoKI1Zpc3VhbGl6ZSBhbmQgYXNzZXNzIHRoZSBjZWxscyBjYWxsZWQgYXMgcHJvYmFibGUgZG91YmxldHMKVU1BUFBsb3QoY29uX3NldV9mdCwgZ3JvdXAuYnkgPSAiREYuY2xhc3NpZmljYXRpb25zXzAuMjVfMC4wOF83MyIpCgojIHRhYmxlIG9mIGRvdWJsZXRzIGFuZCBzaWdubGV0cwpjb25fc2V1X2Z0JERGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMgJT4lIHRhYmxlCgojIHZpc3VhbGl6ZSB0aGUgZmVhdHVyZXMgaW4gZG91YmxldHMgYW5kIHNpbmdsZXRzClZsblBsb3QoY29uX3NldV9mdCwgZmVhdHVyZXMgPSBjKCJuQ291bnRfUk5BIiwgIm5GZWF0dXJlX1JOQSIsICJwZXJjZW50Lk1UIiwgInBBTk5fMC4yNV8wLjA4XzczIiksIAogICAgICAgIGdyb3VwLmJ5ID0gIkRGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMiLCBwdC5zaXplID0gMC4wMDEsIG5jb2wgPSAyLCBsb2cgPSBUUlVFKQoKYGBgCgpgYGB7cn0KIyByZW1vdmUgdGhlIGRvdWJsZXRzCiMgd2UgY2FuIGRvIHRoaXMgYnkgc3Vic2V0CiMgZmlyc3Qgd2UgbmVlZCB0byBzZXQgdGhlIGFjdGl2ZSBtZXRhIGRhdGEgc2xvdCB0byB0aGUgZG91YmxldCBpZGVudGlmaWNhdGlvbgpJZGVudHMoY29uX3NldV9mdCkgPC0gIkRGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMiCiMgd2Ugc2VsZWN0IG9ubHkgdGhlIHNpbmdsZXQgY2VsbHMKY29uX3NldV9mdDIgPC0gc3Vic2V0KGNvbl9zZXVfZnQsIGlkZW50cyA9ICJTaW5nbGV0IikKZGltKGNvbl9zZXVfZnQpCmRpbShjb25fc2V1X2Z0MikKCmBgYAoKCgoKUmVwZWF0IHRoZSBhYm92ZSBzdGVwcyBmb3IgdGhlIFNOQ0EgdHJpcGxpY2F0aW9uIHBhdGllbnQgbGluZQoKYGBge3J9CiMgcmVhZCBpbiBkYXRhCgphc3RfZGF0YSA8LSBSZWFkMTBYKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9BU1QyM19CcmFpbkNvbW0vQ2VsbFJhbmdlck91dHMvQVNUMjMvcmF3X2ZlYXR1cmVfYmNfbWF0cml4IikKCgojIGNyZWF0ZSBzZXVyYXQgb2JqZWN0CgoKIyBmaWx0ZXIgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2V0dGluZ3MgYXMgd2l0aCB0aGUgY29udHJvbAoKCiMgUENBIGFuYWx5c2lzCgojIFJlbW92ZSBkb3VibGV0cwoKCgpgYGAKCgpgYGB7cn0KIyBjbGVhbiB1cCAKcm0oYXN0X2RhdGEsYXN0X3NldV9mdCxiY212bl9hc3QsYmNtdm5fY29uLGNvbl9zZXVfZnQsIHN3ZWVwLnJlcy5hc3QsIHN3ZWVwLnJlcy5jb24sIHN3ZWVwLnN0YXRzX2FzdCwgc3dlZXAuc3RhdHNfY29uKQpgYGAKCgojIEJSRUFLCgpNZXJnZSBkYXRhIG9iamVjdHMKCmBgYHtyfQoKbWVyZ2Vfc2V1cmF0IDwtIG1lcmdlKGNvbl9zZXVfZnQyLGFzdF9zZXVfZnQyKQptZXJnZV9zZXVyYXQKCnVuaXF1ZShtZXJnZV9zZXVyYXQkb3JpZy5pZGVudCkKCgpgYGAKCkZpbmQgYW5jaG9ycyBiZXR3ZWVuIHRoZSB0d28gZGF0YSBvYmplY3RzCmBgYHtyfQpzYW1wbGUubGlzdCA8LSBTcGxpdE9iamVjdChtZXJnZV9zZXVyYXQsIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiKQoKIyBXZSBoYXZlIGFscmVhZHkgbm9ybWFsaXplZCBhbmQgaWRlbnRpZmllZCB2YXJpYWJsZSBmZWF0dXJlcyBpbiBlYWNoIHNhbXBsZQojIElmIHdlIGhhZCBub3QgZG9uZSBzbyB3ZSBjYW4gbm9ybWFsaXplIGhlcmUKI2ZvciAoaSBpbiAxOmxlbmd0aChzYW1wbGUubGlzdCkpewogIyBvcmcubGlzdFtbaV1dIDwtIE5vcm1hbGl6ZURhdGEob3JnLmxpc3RbW2ldXSwgdmVyYm9zZSA9IEZBTFNFKQogICNvcmcubGlzdFtbaV1dIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKG9yZy5saXN0W1tpXV0sIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IikKI30KCiMgTm93IHdlIGZpbmQgZmVhdHVyZXMgdGhhdCBjYW4gYWN0IGFzIGFuY2hvcnMgYmV0d2VlbiB0aGUgdHdvIHNhbXBsZXMKaW50LmFuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IHNhbXBsZS5saXN0LCBkaW1zID0gMTo1MCkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSBpbnQuYW5jaG9ycywgZGltcyA9IDE6NTApCgpgYGAKCgpPcHRpb25hbDogc2F2ZSB0aGUgaW50ZWdyYXRlZCBvYmplY3Qgb3IgcmVhZCBpbiB0aGUgSW50ZWdyYXRlZCBvYmplY3QgZm9yIHRoZSBuZXh0IHN0ZXAuCgpgYGB7cn0KIyByZW1vdmUgIyBjb21tZW50IGZyb20gdGhlIGNvZGUgeW91IHdhbnQgdG8gcnVuCgpzYXZlUkRTKGludGVncmF0ZWRfc2V1cmF0LCJJbnRlZ3JhdGVkU2V1cmF0LlJEUyIpCiNpbnRlZ3JhdGVkX3NldXJhdGUgPC0gcmVhZFJEUygiSW50ZWdyYXRlZFNldXJhdC5SRFMiKQoKYGBgCgpQQ0EgYW5kIFVNQVAgb24gdGhlIG1lcmdlZCBvYmplY3QKCmBgYHtyfQojIG1lcmdlZCBvYmplY3QKCkRlZmF1bHRBc3NheShtZXJnZV9zZXVyYXQpIDwtICJSTkEiCgptZXJnZV9zZXVyYXQgPC0gU2NhbGVEYXRhKG1lcmdlX3NldXJhdCwgdmVyYm9zZSA9IEZBTFNFKQojIGluIHRoZSBtZXJnZSBkYXRhIHNldCB3ZSBzaWxsIG5lZWQgZmVhdHVyZXMgZm9yIHRoZSBQQ0EgaW5wdXQKbWVyZ2Vfc2V1cmF0IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKG1lcmdlX3NldXJhdCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiKQptZXJnZV9zZXVyYXQgPC0gUnVuUENBKG1lcmdlX3NldXJhdCwgbnBjcyA9IDMwLCB2ZXJib3NlID0gRkFMU0UpCm1lcmdlX3NldXJhdCA8LSBSdW5VTUFQKG1lcmdlX3NldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQoKCmBgYAoKCgpSZXBlYXQgUENBIGFuZCBVTUFQIGZvciB0aGUgaW50ZWdyYXRlZCBvYmplY3QKCmBgYHtyfQpEZWZhdWx0QXNzYXkoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkIgppbnRlZ3JhdGVkX3NldXJhdCA8LSBTY2FsZURhdGEoaW50ZWdyYXRlZF9zZXVyYXQsIHZlcmJvc2UgPSBGQUxTRSkKIyBvbmx5IHRoZSBpbnRlZ3JhdGVkIGZlYXR1cmVzIHdpbGwgYmUgdGhlIHBjYSBpbnB1dAoKaW50ZWdyYXRlZF9zZXVyYXQgPC0gUnVuUENBKGludGVncmF0ZWRfc2V1cmF0LCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gUnVuVU1BUChpbnRlZ3JhdGVkX3NldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQoKYGBgCgoKT3B0aW9uYWw6IHNhdmUgdGhlIFBDQSBhbmQgVU1BUCBpbnRlZ3JhdGVkIG9iamVjdCBvciByZWFkIGluIHRoZSBzYXZlZCBvYmplY3QKYGBge3J9CiMgcmVtb3ZlICMgY29tbWVudCBmcm9tIHRoZSBjb2RlIHlvdSB3YW50IHRvIHJ1bgpzYXZlUkRTKGludGVncmF0ZWRfc2V1cmF0LCJJbnRlZ3JhdGVkU2V1cmF0R3JhcGhzLlJEUyIpCiNpbnRlZ3JhdGVkX3NldXJhdCA8LSByZWFkUkRTKCJJbnRlZ3JhdGVkU2V1cmF0R3JhcGhzLlJEUyIpCgpgYGAKCkxldCdzIGxvb2sgYXQgdGhlIFVNQVBzIGZyb20gdGhlIG1lcmdlZCB2cyB0aGUgaW50ZWdyYXRlZCBkYXRhCmBgYHtyfQoKcDEgPC0gRGltUGxvdChtZXJnZV9zZXVyYXQsIGdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiKSArIGdndGl0bGUoIk1lcmdlIikKcDIgPC0gRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIpICsgZ2d0aXRsZSgiSW50ZWdyYXRlZCIpCgpwMQpwMgoKYGBgCldlIHNlZSBhbG1vc3Qgbm8gZGlmZmVyZW5jZSBpbiB0aGlzIGRhdGEuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGFsbCBkYXRhIHNldHMKCkNsdXN0ZXIgdGhlIGludGVncmF0ZWQgZGF0YQoKYGBge3J9CiMgc2VlIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBwY2EgY29tcG9uZW50cwpFbGJvd1Bsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIG5kaW1zPTMwKQppbnRlZ3JhdGVkX3NldXJhdAoKYGBgCgpgYGB7cn0KZGltKGludGVncmF0ZWRfc2V1cmF0KQoKYGBgCgpXZSB3aWxsIGNob29zZSAyMCBQQ3MKVGhlcmUgYXJlIDQwMjggY2VsbHMuICBBIGNvbW1vbiBydWxlIG9mIHRodW1iIGZvciBjaG9vc2luZyBrIGZvciBuZWFyZXN0IG5laWdoYm91cnMgaXMgdXNpbmcgdGhlIHNxdWFyZSByb290IG9mIHRoZSBudW1iZXIgb2YgY2VsbHMgPSA2MwoKYGBge3J9CiMgY2FsY3VsYXRlIHRoZSBzcXVhcmUgcm9vdApzcXJ0KDQwMjgpCgojIHRoZSBLIHBhcmFtZXRlciBjaGFuZ2VzIHRoZSBzaXplIG9mIGNsdXN0ZXJzIGJ5IGNoYW5naW5nIHRoZSBzdGFydGluZyBub2RlcyBpbnB1dCBpbnRvIHRoZSBMb3V2YWluIG5ldHdvcmsKCmludGVncmF0ZWRfc2V1cmF0IDwtIEZpbmROZWlnaGJvcnMoaW50ZWdyYXRlZF9zZXVyYXQsIGRpbXMgPSAxOjIwLCBrLnBhcmFtID0gNjMpCiMgdGhlIG51bWJlciBvZiBjbHVzdGVycyBpcyBkZXBlbmRlbnQgb24gdGhlIHJlc29sdXRpb24gYSBudW1iZXIgZnJvbSAwLTIuIAojIEhpZ2hlciB2YWx1ZXMgbWFrZSBtb3JlIGNsdXN0ZXJzCiMgd2UgaW5jbHVkZSAKaW50ZWdyYXRlZF9zZXVyYXQgPC0gRmluZENsdXN0ZXJzKGludGVncmF0ZWRfc2V1cmF0LCByZXNvbHV0aW9uID0gYygwLDAuMDUsMC4yNSwwLjQsMC41LDAuNiwxLDEuNSkgKQoKIyB3ZSBjYW4gdmlzdWFsaXplIHdoaWNoIGNlbGxzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyB1c2luZyBjbHVzdHJlZQoKY2x1c3RyZWUoaW50ZWdyYXRlZF9zZXVyYXQsIHByZWZpeCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuIikKCmBgYAoKClZpc3VhbGl6ZSB0aGUgVU1BUCBvZiB0aGUgZGlmZmVyZW50IGNsdXN0ZXIgcmVzb2x1dGlvbnMKYGBge3J9CnJlcyA8LSBjKDAuMDUsMC4yNSwwLjQsMC41LDAuNiwxLDEuNSkKcmVzb2x1dGlvbnMgPC0gcGFzdGUoImludGVncmF0ZWRfc25uX3Jlcy4iLCByZXMsIHNlcD0iIikKcmVzb2x1dGlvbnMKCmZvcihyIGluIHJlc29sdXRpb25zKXsKICBwcmludChEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9IHIpKQp9CgoKYGBgCgojIEJSRUFLCgoKTm93IHdlIG5lZWQgdG8gY2hvb3NlIGEgcmVzb2x1dGlvbiB0byBhbm5vdGF0ZS4KSSB3aWxsIHNlbGVjdCByZXNvbHV0aW9uIG9mIDAuNi4KCmBgYHtyfQojIFNjYWxlIHRoZSB0b3RhbCBSTkEKIyBiZWZvcmUgd2Ugb25seSBzY2FsZWQgdGhlIGludGVncmF0ZWQgZXhwcmVzc2lvbiBmb3IgdGhlIGdlbmVzIHVzZWQgZm9yIGludGVncmF0aW9uCiMgbm93IHdlIHdhbnQgdG8gc2NhbGUgYWxsIGdlbmVzCgpEZWZhdWx0QXNzYXkoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJSTkEiCmludGVncmF0ZWRfc2V1cmF0IDwtIFNjYWxlRGF0YShpbnRlZ3JhdGVkX3NldXJhdCkKCgpgYGAKCgoKTG9vayBhdCBrbm93biBjZWxsIHR5cGUgbWFya2VycwoKYGBge3J9CiMgZmVhdHVyZXMgbGlzdCBmcm9tIGxpdGVyYXR1cmUKCmRhX25ldXJvbnMgPC0gYygiVEgiLCJTTEM2QTMiLCJTTEMxOEEyIiwiU09YNiIsIk5ETkYiLCJTTkNHIiwiQUxESDFBMSIsIkNBTEIxIiwiVEFDUjIiLCJTTEMxN0E2IiwiU0xDMzJBMSIsIk9UWDIiLCJHUlAiLCJMUEwiLCJDQ0siLCJWSVAiKQpOUENfb3JTdGVtTGlrZSA8LSBjKCJEQ1giLCJORVVST0QxIiwiVEJSMSIsIlBDTkEiLCJNS0k2NyIsIlNPWDIiLCJORVMiLCJQQVg2IiwiTUFTSDEiKQptYXR1cmVfbmV1cm9ucyA9IGMoIlJCRk9YMyIsIlNZUCIsIkRMRzQ1IiwiVkFNUDEiLCJWQU1QMiIsIlRVQkIzIiwiU1lUMSIsIkJTTiIsIkhPTUVSMSIsIlNMQzE3QTYiKQpleGNpdGF0b3J5X25ldXJvbnMgPSBjKCJHUklBMiIsIkdSSUExIiwiR1JJQTQiLCJHUklOMSIsIkdSSU4yQiIsIkdSSU4yQSIsIkdSSU4zQSIsIkdSSU4zIiwiR1JJUDEiLCJDQU1LMkEiKQppbmhiaXRvcnlfbmV1cm9ucyA9IGluaCA9IGMoIkdBRDEiLCJHQUQyIiwgIkdBVDEiLCJQVkFMQiIsIkdBQlIyIiwiR0FCUjEiLCJHQlJSMSIsIkdBQlJCMiIsIkdBQlJCMSIsIkdBQlJCMyIsIkdBQlJBNiIsIkdBQlJBMSIsIkdBQlJBNCIsIlRSQUsyIikKYXN0cm9jeXRlcyA8LSBjKCJHRkFQIiwiUzEwMEIiLCJBUVA0IiwiQVBPRSIsICJTT1g5IiwiU0xDMUEzIikKb2xpZ29kZW5kcm9jeXRlcyA8LSBjKCJNQlAiLCJNT0ciLCJPTElHMSIsIk9MSUcyIiwiU09YMTAiKQpvcGMgPC0gCnJhZGlhbF9nbGlhIDwtIGMoIlBUUFJDIiwiQUlGMSIsIkFER1JFMSIsICJWSU0iLCAiVE5DIiwiUFRQUloxIiwiRkFNMTA3QSIsIkhPUFgiLCJMSUZSIiwKICAgICAgICAgICAgICAiSVRHQjUiLCJJTDZTVCIsIlNMQzFBMyIpCmVwaXRoZWxpYWwgPC0gYygiSEVTMSIsIkhFUzUiLCJTT1gyIiwiU09YMTAiLCJORVMiLCJDREgxIiwiTk9UQ0gxIikKCm1pY3JvZ2xpYSA8LSBjKCJJQkExIiwiUDJSWTEyIiwiUDJSWTEzIiwiVFJFTTExOSIsICJHUFIzNCIsIlNJR0xFQ0giLCJUUkVNMiIsCiAgICAgICAgICAgICAgICJDWDNDUjEiLCJGQ1JMUyIsIk9MRk1MMyIsIkhFWEIiLCJUR0ZCUjEiLCAiU0FMTDEiLCJNRVJUSyIsCiAgICAgICAgICAgICAgICJQUk9TMSIpCgpmZWF0dXJlc19saXN0IDwtIGMoIk1LSTY3IiwiU09YMiIsIlBPVTVGMSIsIkRMWDIiLCJQQVg2IiwiU09YOSIsIkhFUzEiLCJORVMiLCJSQkZPWDMiLCJNQVAyIiwiTkNBTTEiLCJDRDI0IiwiR1JJQTIiLCJHUklOMkIiLCJHQUJCUjEiLCJHQUQxIiwiR0FEMiIsIkdBQlJBMSIsIkdBQlJCMiIsIlRIIiwiQUxESDFBMSIsIkxNWDFCIiwiTlI0QTIiLCJDT1JJTiIsIkNBTEIxIiwiS0NOSjYiLCJDWENSNCIsIklUR0E2IiwiU0xDMUEzIiwiQ0Q0NCIsIkFRUDQiLCJTMTAwQiIsICJQREdGUkEiLCJPTElHMiIsIk1CUCIsIkNMRE4xMSIsIlZJTSIsIlZDQU0xIikKCnNob3J0X2xpc3QgPC0gYygiTUtJNjciLCJTT1g5IiwiSEVTMSIsIk5FUyIsIkRMWDIiLCJSQkZPWDMiLCJNQVAyIiwiVEgiLCJDQUxCMSIsIktDTko2IiwiU0xDMUEzIiwiQ0Q0NCIsIkFRUDQiLCJTMTAwQiIsIk9MSUcyIiwiTUJQIiwiVklNIikKCgoKYGBgCgpTZXVyYXQgaGFzIHNldmVyYWwgaGVscGZ1bCBwbG90dGluZyBmdW5jdGlvbiB0aGF0IHVzZSBnZ3Bsb3QKCmBgYHtyfQojIHdlIHNldCB0aGUgYWN0aXZlIGlkZW50aXR5IG9mIHRoZSBtZXRhIGRhdGEgdG8gYmUgdGhlIGNsdXN0ZXJzIGF0IHRoZSByZXNvbHV0aW9uIHdlIHdhbnQgdG8gbGFiZWwKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuNiIKCkZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBsYWJlbCA9IFRSVUUsIGZlYXR1cmVzID0gc2hvcnRfbGlzdCkKCgoKYGBgCgoKCmBgYHtyfQojIHRoaXMgd2lsbCBsZXQgdXMgc2VlIG9uZSBhdCBhdCB0aW1lCmZvciAoaSBpbiBzaG9ydF9saXN0KSB7CiAgcHJpbnQoRmVhdHVyZVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGZlYXR1cmVzID0gaSwgbWluLmN1dG9mZiA9ICdxMScsIG1heC5jdXRvZmYgPSAncTk3JywgbGFiZWwgPSBUUlVFKSkKfQoKCmBgYApOb3cgdGhhdCB3ZSBzZWUgdGhlIFRIIGlzIGFsbCBpbiBvbmUgc3BvdCB0aGF0IGlzIHBhcnQgb2YgYSBsYXJnZSBjbHVzdGVyIHdlIGxvb2sgYmFjayBhdCB0aGUgZGlmZmVyZW50IGNsdXN0ZXIgbGV2ZWwuCgpgYGB7cn0KCiMgc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2FtcGxlcwpGZWF0dXJlUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZmVhdHVyZXMgPSAiVklNIiwgbWluLmN1dG9mZiA9ICdxMScsIG1heC5jdXRvZmYgPSAncTk3JywgbGFiZWwgPSBUUlVFLCBzcGxpdC5ieSA9ICJvcmlnLmlkZW50IikKCgojIGxvb2sgYXQgdGhlIEZlYXR1cmUgcGxvdHMgd2l0aCB0aGUgY2x1c3RlciByZXNvbHV0aW9uIDEKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiCkZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBsYWJlbCA9IFRSVUUsIGZlYXR1cmVzID0gYygiVklNIiwiQVFQNCIpKQoKYGBgCgoKRG90IFBsb3RzCgpgYGB7cn0KCkRvdFBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4xIiwgCiAgICAgICAgZmVhdHVyZXMgPSBzaG9ydF9saXN0LCBhc3NheSA9ICJSTkEiKSArIFJvdGF0ZWRBeGlzKCkKCgoKRG90UGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiLCAKICAgICAgICBmZWF0dXJlcyA9IGRhX25ldXJvbnMsIGFzc2F5ID0gIlJOQSIpICsgUm90YXRlZEF4aXMoKQoKRG90UGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiLCAKICAgICAgICBmZWF0dXJlcyA9IG1hdHVyZV9uZXVyb25zLCBhc3NheSA9ICJSTkEiKSArIFJvdGF0ZWRBeGlzKCkKCgpgYGAKCkhlYXRtYXBzCgpgYGB7cn0KCgpEb0hlYXRtYXAoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4xIiwgCiAgICAgICAgZmVhdHVyZXMgPSBzaG9ydF9saXN0LCBzbG90ID0gInNjYWxlLmRhdGEiKQoKCmBgYAoKTG9vayBhdCBtb3JlIGV4cHJlc3Npb24gbGlzdHMKCmBgYHtyfQoKCmBgYAoKCkZpbmQgQ2x1c3RlciBtYXJrZXJzCgpgYGB7cn0KIyBjbHVzdGVyIG1hcmtlcnMgd2lsbCBiZSBjYWxjdWxhdGVkIGZvciB0aGUgYWN0aXZlIGlkZW50aXR5CgpJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIKQ2x1c3Rlck1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoaW50ZWdyYXRlZF9zZXVyYXQsIG9ubHkucG9zID0gVFJVRSkKCiMgb3B0aW9uYWw6IHNhdmUgdGhlIGNsdXN0ZXIgbWFya2Vycwojd3JpdGUuY3N2KENsdXN0ZXJNYXJrZXJzLCJDbHVzdGVyTWFya2Vycy5jc3YiKQoKCgpgYGAKClNlZSB0aGUgdG9wIGNsdXN0ZXIgbWFya2VycwoKYGBge3J9CmhlYWQoQ2x1c3Rlck1hcmtlcnMpCnRvcDUgPC0gQ2x1c3Rlck1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuPTUsIHd0ID1hdmdfbG9nMkZDKQoKdG9wMiA8LSBDbHVzdGVyTWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG49Miwgd3QgPWF2Z19sb2cyRkMpCkRvSGVhdG1hcChpbnRlZ3JhdGVkX3NldXJhdCwgZmVhdHVyZXMgPSB0b3A1JGdlbmUsIHNpemUgPSAzLCBhbmdsZSA9IDkwLCBncm91cC5ieSA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIpCgpEb0hlYXRtYXAoaW50ZWdyYXRlZF9zZXVyYXQsIGZlYXR1cmVzID0gdG9wMiRnZW5lLCBzaXplID0gMywgYW5nbGUgPSA5MCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiKQoKYGBgCgpOb3cgd2UgY2FuIGxvb2sgYXQgdGhlIGNsdXN0ZXIgbWFya2VycyBmb3IgY2x1c3RlciB1c2luZyBFbnJpY2hSIHRvIGNvbXBhcmUgdG8gcmVmZXJlbmNlIGxpYnJhcmllcwoKYGBge3J9CgoKc2V0RW5yaWNoclNpdGUoIkVucmljaHIiKSAjIEh1bWFuIGdlbmVzCiMgbGlzdCBvZiBhbGwgdGhlIGRhdGFiYXNlcwoKZGJzIDwtIGxpc3RFbnJpY2hyRGJzKCkKCiMgdGhpcyB3aWxsIGxpc3QgdGhlIHBvc3NpYmxlIGxpYnJhcmllcwpkYnMKCiMgc2VsZWN0IGxpYnJhcmllcyB3aXRoIGNlbGwgdHlwZXMKZGIgPC0gYygnQ2VsbE1hcmtlcl9BdWdtZW50ZWRfMjAyMScsJ0F6aW11dGhfQ2VsbF9UeXBlc18yMDIxJykKCgpgYGAKCgoKSGVyZSBpcyBhIHNtYWxsIGZ1bmN0aW9uIHRvIHJ1biBlYXNpbHkgb24gZWFjaCBjbHVzdGVyIGFuZCBmaW5kIHRoZSBjZWxsIHR5cGUgbGlicmFyeSBwcmVkaWN0aW9ucyAoc3BlY2lmaWMgdG8gdGhlIGxpYnJhcmllcyBJIHNlbGVjdGVkKQoKYGBge3J9CgpjaGVja0NlbGx0eXBlcyA8LSBmdW5jdGlvbihjbHVzdGVyX251bSA9IDApewogIGNsdXN0ZXJYIDwtIENsdXN0ZXJNYXJrZXJzICU+JSBmaWx0ZXIoY2x1c3RlciA9PSBjbHVzdGVyX251bSAmIGF2Z19sb2cyRkMgPiAwLjI1KQogIGdlbmVzIDwtIGNsdXN0ZXJYJGdlbmUKICAjIHRoZSBjZWxsIHR5cGUgbGlicmFyaWVzCiAgIyBnZXQgdGhlIHJlc3VsdHMgZm9yIGVhY2ggbGlicmFyeQogIGNsdXN0ZXJYLmNlbGwgPC0gZW5yaWNocihnZW5lcywgZGF0YWJhc2VzID0gZGIpCiAgIyB2aXN1YWxpemUgdGhlIHJlc3VsdHMKcHJpbnQocGxvdEVucmljaChjbHVzdGVyWC5jZWxsW1sxXV0sIHNob3dUZXJtcyA9IDIwLCBudW1DaGFyID0gNDAsIHkgPSAiQ291bnQiLCBvcmRlckJ5ID0gIlAudmFsdWUiLCB0aXRsZSA9ICdDZWxsTWFya2VyX0F1Z21lbnRlZF8yMDIxJykpCnByaW50KHBsb3RFbnJpY2goY2x1c3RlclguY2VsbFtbMl1dLCBzaG93VGVybXMgPSAyMCwgbnVtQ2hhciA9IDQwLCB5ID0gIkNvdW50Iiwgb3JkZXJCeSA9ICJQLnZhbHVlIiwgdGl0bGUgPSAnQXppbXV0aF9DZWxsX1R5cGVzXzIwMjEnKSkKCn0KCgpgYGAKClJ1biB0aGUgZnVuY3Rpb24gZm9yIGVhY2ggY2x1c3RlciB0byBzZWUgaWYgd2UgY2FuIGlkZW50aWZ5IGNlbGwgdHlwZXMKCmBgYHtyfQoKY2x1c3RlcjAgPC0gY2hlY2tDZWxsdHlwZXMoY2x1c3Rlcl9udW0gPSAwKQoKYGBgCkNsdXN0ZXIgMCBpcyBsaWtlbHkgaW1tYXR1cmUgbmV1cm9ucyAtIHBvc3NpYmx5IGJvdGggR2x1dGFtYXRlcmdpYyBhbmQgZ2FiYWVyZ2ljCgpgYGB7cn0KY2x1c3RlcjEgPC0gY2hlY2tDZWxsdHlwZXMoY2x1c3Rlcl9udW0gPSAxKQoKYXMuZGF0YS5mcmFtZShjbHVzdGVyMSRkYXRhKQpjbHVzdGVyMVtbImRhdGEiXV0KCgpgYGAKQ2x1c3RlciAxIGlzIGFzdHJvY3l0ZXMKCmBgYHtyfQoKY2hlY2tDZWxsdHlwZXMoY2x1c3Rlcl9udW0gPSAxMSkKCmBgYAoKQWZ0ZXIgd2UgaGF2ZSBsb29rZWQgYXQgYWxsIHRoZSBjbHVzdGVycyB3ZSBhZGQgbWFudWFsIGFubm90YXRpb25zCgoKYGBge3J9CgojIHdlIG5lZWQgdG8gc2V0IHRoZSBpZGVudGl0eSB0byByZW5hbWUKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiCgojIHdlIG5lZWQgdG8gbWFrZSBhIHZlY3RvciBvZiB0aGUgY2VsbCB0eXBlIGluIHRoZSBzYW1lIG9yZGVyIC0gaW4gdGhlIGNsdXN0ZXIgb3JkZXIKCmNlbGxfdHlwZXMxIDwtIGMoIm5ldXJvbnNfaW1tYXR1cmUiLCAiYXN0cm9jeXRlc18xIiwiZ2xpYSIsCiAgICAgICAgICAgICAgICAgIm5ldXJvbnNfbWF0dXJlIiwiT1BDIiwiZW5kb3RoZWxpYWxfMSIsCiAgICAgICAgICAgICAgICAgImVuZG90aGVsaWFsXzIiLCJhc3Ryb2N5dGVfMiIsIlJhZGlhbEdsaWEiLAogICAgICAgICAgICAgICAgICJuZXVyb25zMSIsIm5ldXJvbnNfR0FCQSIsIm5ldXJvbnMyIiwibmV1cmFsX3N0ZW0iLCJEQW5ldXJvbnMiKQogIApuYW1lcyhjZWxsX3R5cGVzMSkgPC0gbGV2ZWxzKGludGVncmF0ZWRfc2V1cmF0KQppbnRlZ3JhdGVkX3NldXJhdCA8LSBSZW5hbWVJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQsIGNlbGxfdHlwZXMxKQppbnRlZ3JhdGVkX3NldXJhdCA8LSBBZGRNZXRhRGF0YShvYmplY3Q9aW50ZWdyYXRlZF9zZXVyYXQsIG1ldGFkYXRhPUlkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCksIGNvbC5uYW1lID0gIkNlbGxUeXBlcyIpCgoKYGBgCgoKTGV0cyBsb29rIGF0IHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUgVU1BUAoKYGBge3J9CgpEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9ICJDZWxsVHlwZXMiLCBsYWJlbCA9IFRSVUUpCgpgYGAKCgojIEJSRUFLCgoKQXV0b21hdGVkIGFubm90YXRpb24gCldlIHJlcXVpcmUgcmVmZXJlbmNlIGRhdGEgb2JqZWN0cyBmb3IgYm90aCBtZXRob2RzIHdlIHdpbGwgdXNlCgpgYGB7cn0KCiMgZGV2ZWxvcGluZyBmb3JlYnJhaW4KZGV2Zm9yZWJyYWluIDwtIHJlYWRSRFMoIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1B1YmxpY0RhdGEvS2Fyb2xpbnNraV9EZXZGb3JlYnJhaW5fZG93bnNhbXBsZV9MZXZlbDEuUkRTIikKCiMgZGV2ZWxvcGluZyBjb3J0ZXgKCmRldmNvdGV4IDwtIHJlYWRSRFMoIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1B1YmxpY0RhdGEvTm93YWtvd3NraV9kZXZfY29ydGV4dC5SRFMiKQoKIyBhZHVsdCBtaWRicmFpbgoKbWlkYnJhaW4gPC0gcmVhZFJEUygiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUHVibGljRGF0YS9LYW1hdGhUb3RhbF9kb3duc2FtcGxlLlJEUyIpCgojY2hlY2sgdGhlIG1ldGEgZGF0YQpwcmludCgiRGV2ZWxvcGluZyBGb3JlYnJhaW4iKQpjb2xuYW1lcyhkZXZmb3JlYnJhaW5AbWV0YS5kYXRhKQpwcmludCgiRGV2ZWxvcGluZyBjb3J0ZXgiKQpjb2xuYW1lcyhkZXZjb3RleEBtZXRhLmRhdGEpCnByaW50KCJBZHVsdCBtaWRicmFpbiIpCmNvbG5hbWVzKG1pZGJyYWluQG1ldGEuZGF0YSkKCiMgd2UgbmVlZCB0byBrbm93IHRoZSBtZXRhZGF0YSBzbG90IG5hbWUgdG8gdXNlCgoKYGBgCgpTZXVyYXQgbGFiZWwgdHJhbnNmZXIgdXNpbmcgZmluZCBhbmNob3JzIC0gcHJlZGljdHMgY2VsbCB0eXBlcyBmcm9tIGEgcmVmZXJlbmNlIFNldXJhdCBvYmplY3QKCmBgYHtyfQoKIyBzZXQgdGhlIGFjdGl2ZSBtZXRhIGRhdGEgdG8gYmUgdGhlIGNlbGwgdHlwZSBsYWJlbHMgd2Ugd2FudAoKSWRlbnRzKGRldmZvcmVicmFpbikgPC0gIkNlbGx0eXBlcyIKIyBzZXQgdGhlIGRlZmF1bHQgYXNzYXkgdG8gYmUgUk5BIGJlY2F1c2UgdGhvc2UgYXJlIHRoZSBleHByZXNzaW9uIHZhbHVlcyB3ZSB3YW50CkRlZmF1bHRBc3NheShkZXZmb3JlYnJhaW4pIDwtICJSTkEiCkRlZmF1bHRBc3NheShpbnRlZ3JhdGVkX3NldXJhdCkgPC0gIlJOQSIKCgojIGZpbmQgdGhlIHJlZmVyZW5jZSBhbmNob3JzCmFuY2hvcnMgPC0gRmluZFRyYW5zZmVyQW5jaG9ycyhyZWZlcmVuY2UgPSBkZXZmb3JlYnJhaW4gLHF1ZXJ5ID0gaW50ZWdyYXRlZF9zZXVyYXQsIGRpbXMgPSAxOjI1KQoKIyBub3cgd2UgbWFrZSBwcmVkaWN0aW9ucyB3aXRoIHRoZSBhbmNob3JzCnByZWRpY3Rpb25zIDwtIFRyYW5zZmVyRGF0YShhbmNob3JzZXQgPSBhbmNob3JzLCByZWZkYXRhID0gZGV2Zm9yZWJyYWluJENlbGx0eXBlcykKCiMgbG9vayBhdCB0aGUgcHJlZGljdGlvbnMgb3V0cHV0CmhlYWQocHJlZGljdGlvbnMpCgojIGFkZCB0aGUgcHJlZGljdGlvbnMgdG8gdGhlIG1ldGEgZGF0YQppbnRlZ3JhdGVkX3NldXJhdCA8LSBBZGRNZXRhRGF0YShpbnRlZ3JhdGVkX3NldXJhdCwgbWV0YWRhdGEgPSBwcmVkaWN0aW9ucyRwcmVkaWN0ZWQuaWQsIGNvbC5uYW1lID0gInByZWRpY3RlZF9JRCIpCgojIHdlIGNhbiBhbHNvIGNvbnNpZGVyIHRoZSBwcm9iYWJpbGl0eSBvZiBlYWNoIHByZWRpY3Rpb24KaW50ZWdyYXRlZF9zZXVyYXQkcHJlZGljdGVkX3RocmVzaG9sZCA8LSBpZmVsc2UocHJlZGljdGlvbnMkcHJlZGljdGlvbi5zY29yZS5tYXggPiAwLjc1LCBpbnRlZ3JhdGVkX3NldXJhdCRwcmVkaWN0ZWRfSUQsICJOb25lIikKCiAKIyMgY2hlY2sgdGhlIHByb3BvcnRpb24gb2YgY2VsbCB0eXBlcyBwcmVkaWN0ZWQgaW4gZWFjaCBjbHVzdGVyCgp0LmxhYmxlcyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGludGVncmF0ZWRfc2V1cmF0JGludGVncmF0ZWRfc25uX3Jlcy4xLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGVkX3NldXJhdCRwcmVkaWN0ZWRfSUQpKQp0LmxhYmxlcyRGcmVxIDwtIGFzLmRvdWJsZSh0LmxhYmxlcyRGcmVxKQpnZ3Bsb3QodC5sYWJsZXMsIGFlcyh5ID0gRnJlcSwgeCA9IFZhcjEsIGZpbGwgPSBWYXIyKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsIHN0YXQ9ICJpZGVudGl0eSIpCgojIHNlZSBwcmVkaWN0aW9ucyBieSBjbHVzdGVyIGluIGEgdGFibGUKdG9wLnByZWQgPC0gYXMuZGF0YS5mcmFtZSh0LmxhYmxlcyAgJT4lIGdyb3VwX2J5KFZhcjEpICAlPiUgdG9wX24oMiwgRnJlcSkpICU+JSBhcnJhbmdlKFZhcjEsIGRlc2MoRnJlcSkpCnRvcC5wcmVkCgoKCmBgYAoKCgoKc2NDbGFzc2lmeSBSIHdlaWdodGVkIGtOTiBodHRwczovL2RvaS5vcmcvMTAuMTUyNTIvbXNiLjIwMTk5Mzg5Cmh0dHBzOi8vc3lkbmV5YmlveC5naXRodWIuaW8vc2NDbGFzc2lmeS9hcnRpY2xlcy9zY0NsYXNzaWZ5Lmh0bWwKCldlIG5lZWQgdG8gbWFrZSB0aGUgcmVmZXJlbmNlIGFuZCBxdWVyeSBvYmplY3RzIGludG8gYSAiZGdDTWF0cml4IiBvYmplY3QKCmBgYHtyfQoKcmVmIDwtIGRldmZvcmVicmFpbgoKcmVmJExldmVsMSA8LSBOVUxMCgpjb2xuYW1lcyhyZWZAbWV0YS5kYXRhKQoKCiMgbWFrZSBhIGRmQ01hdHJpeCBmcm9tIFNldXJhdCBvYmplY3QgdG8gdXNlIGluIHNjQ2xhc3NpZnkKSWRlbnRzKHJlZikgPC0gIkNlbGx0eXBlcyIKCmRnQ01hdF9yZWYgPC0gR2V0QXNzYXlEYXRhKHJlZikKIyBnZXQgdGhlIGNlbGwgdHlwZSBkYXRhCklkZW50cyhyZWYpIDwtICJDZWxsdHlwZXMiCnJlZl9jZWxsdHlwZXMgPC0gSWRlbnRzKHJlZikKdW5pcXVlKHJlZl9jZWxsdHlwZXMpCgoKIyBjb252ZXJ0IHRoZSBpbnRlZ3JhdGVkIGNsdXN0ZXJlZCBvYmplY3QgaW50byBkZ0NNYXRyaXgKRGVmYXVsdEFzc2F5KGludGVncmF0ZWRfc2V1cmF0KSA8LSAiUk5BIgpkZ0NNYXRfcXVlcnkgPC0gR2V0QXNzYXlEYXRhKGludGVncmF0ZWRfc2V1cmF0KQoKIyBnZXQgdGhlIG1ldGEgZGF0YSB0byBncm91cCBwcmVkaWN0aW9ucyBieQojIHdlIHdpbGwgdXNlIHRoZSBjbHVzdGVycyBpZHMgCiMgd2UgY291bGQgdXNlIHRoZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgd2UgbWFkZSBhYm92ZQoKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiCnF1ZXJ5X2NsdXN0ZXJzIDwtIElkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkKCklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gIkNlbGxUeXBlcyIgIApxdWVyeV9jZWxsdHlwZXMgPC0gSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KQoKbGVuZ3RoKHF1ZXJ5X2NsdXN0ZXJzKQojIGNoZWNrIHRoZSBvYmplY3RzCmRpbShkZ0NNYXRfcmVmKQpkaW0oZGdDTWF0X3F1ZXJ5KQoKY2xhc3MoZGdDTWF0X3JlZikKY2xhc3MoZGdDTWF0X3F1ZXJ5KQoKYGBgCgpTZWUgdGhlIG9yaWdpbmFsIGNlbGwgdHlwZSBhbm5vdGF0aW9ucwpgYGB7cn0KdGFibGUocmVmX2NlbGx0eXBlcykKdGFibGUocXVlcnlfY2x1c3RlcnMpCgpsZW5ndGgocmVmX2NlbGx0eXBlcykKbGVuZ3RoKHF1ZXJ5X2NlbGx0eXBlcykKCnF1ZXJ5X2NlbGx0eXBlc1sxOjEwXQoKCmBgYAoKUnVuIHNjQ2xhc3NpZnkKYGBge3J9CgpzY0NsYXNzaWZ5X3JlcyA8LSBzY0NsYXNzaWZ5KGV4cHJzTWF0X3RyYWluID0gZGdDTWF0X3JlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsVHlwZXNfdHJhaW4gPSByZWZfY2VsbHR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzTWF0X3Rlc3QgPSBkZ0NNYXRfcXVlcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFR5cGVzX3Rlc3QgPSBxdWVyeV9jZWxsdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9ICJIT1BBQ0giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSA9ICJXS05OIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RGZWF0dXJlcyA9IGMoImxpbW1hIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltaWxhcml0eSA9IGMoInBlYXJzb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQoKCgpgYGAKCmBgYHtyfQoKCnBsb3RDZWxsVHlwZVRyZWUoY2VsbFR5cGVUcmVlKHNjQ2xhc3NpZnlfcmVzJHRyYWluUmVzKSkKCgpgYGAKCgoKU2VlIHRoZSBjZWxsIHR5cGUgcHJlZGljdGlvbnMgYnkgY2x1c3RlcgoKYGBge3J9Cgp0YWJsZShzY0NsYXNzaWZ5X3JlcyR0ZXN0UmVzJHRlc3QkcGVhcnNvbl9XS05OX2xpbW1hJHByZWRSZXMscXVlcnlfY2x1c3RlcnMpCnRhYmxlKHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcyxxdWVyeV9jZWxsdHlwZXMpCgpgYGAKCgpDaGVjayBhbm90aGVyIHJlZmVyZW5jZSBzZXQKCmBgYHtyfQojIHJlZnJlbmNlIGRhdGEKIyB3ZSBoYXZlIHRoZSBkYXRhIHByZXBhcmVkIGFzIGEgU2V1cmF0IG9iamVjdAoKcmVmMiA8LSBtaWRicmFpbgpyZWYyCgojY2hlY2sgdGhlIG1ldGEgZGF0YQpjb2xuYW1lcyhyZWYyQG1ldGEuZGF0YSkKCiNtYWtlIHRoZSByZWZlcmVuY2UgbWF0cml4IGFuZCByZWZlcmVuY2UgY2VsbCB0eXBlcyAKCgpkZ0NNYXRfcmVmMiA8LSBHZXRBc3NheURhdGEocmVmMikKIyBnZXQgdGhlIGNlbGwgdHlwZSBkYXRhCklkZW50cyhyZWYyKSA8LSAiQ2VsbF9UeXBlIiAKcmVmX2NlbGx0eXBlczIgPC0gSWRlbnRzKHJlZjIpCnVuaXF1ZShyZWZfY2VsbHR5cGVzMikKCiMgY2hlY2sgdGhlIG9iamVjdApkaW0oZGdDTWF0X3JlZjIpCgoKY2xhc3MoZGdDTWF0X3JlZjIpCgoKCmBgYAoKYGBge3J9CiMgcHJlZGljdCB0aGUgY2x1c3RlciBjZWxsIHR5cGVzIGZyb20gdGhlIHNlY29uZCByZWZlcmVuY2UKc2NDbGFzc2lmeV9yZXMgPC0gc2NDbGFzc2lmeShleHByc01hdF90cmFpbiA9IGRnQ01hdF9yZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUeXBlc190cmFpbiA9IHJlZl9jZWxsdHlwZXMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzTWF0X3Rlc3QgPSBkZ0NNYXRfcXVlcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFR5cGVzX3Rlc3QgPSBxdWVyeV9jbHVzdGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gIkhPUEFDSCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gIldLTk4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEZlYXR1cmVzID0gYygibGltbWEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1pbGFyaXR5ID0gYygicGVhcnNvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkxpc3QgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpClN5cy50aW1lKCkKCmBgYAoKYGBge3J9CgpwbG90Q2VsbFR5cGVUcmVlKGNlbGxUeXBlVHJlZShzY0NsYXNzaWZ5X3JlcyR0cmFpblJlcykpCgpgYGAKClNlZSB0aGUgcHJlZGljdGlvbnMgYnkgY2x1c3RlcgoKYGBge3J9CnRhYmxlKHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcyxxdWVyeV9jbHVzdGVycykKCgoKYGBgCgpgYGB7cn0KIyByZWZvcm1hdCB0byBzZWUgdGhlIHRvcCBwcmVkaWN0aW9ucyBmb3IgZWFjaCBjbHVzdGVyCgpwcmVkX2NvdW50cyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHF1ZXJ5X2NsdXN0ZXJzLHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcykpCgpwcmVkX2NvdW50cyRGcmVxIDwtIGFzLmRvdWJsZShwcmVkX2NvdW50cyRGcmVxKQoKaGVhZChwcmVkX2NvdW50cykKIyBzZWUgcHJlZGljdGlvbnMgYnkgY2x1c3RlciBpbiBhIHRhYmxlCnRvcC5wcmVkIDwtIGFzLmRhdGEuZnJhbWUocHJlZF9jb3VudHMgICU+JSBncm91cF9ieShxdWVyeV9jbHVzdGVycykgICU+JSB0b3BfbigyLCBGcmVxKSkgJT4lIGFycmFuZ2UocXVlcnlfY2x1c3RlcnMsIGRlc2MoRnJlcSkpCnRvcC5wcmVkCgoKYGBgCgoKQWRkIHByZWRpY3Rpb24gYW5ub3RhdGlvbnMKCgpgYGB7cn0KCgpgYGAKCkFkanVzdCBhbm5vdGF0aW9ucyAtIG1lcmdlIGNsdXN0ZXJzIG9yIG5vdAoKYGBge3J9CgoKYGBgCgoKCgo=